@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
@@ -1,20 +0,0 @@
1
- export async function emitRequestReceived(deps, batchId, route, parsed) {
2
- const json = JSON.stringify(parsed);
3
- const bodyBytes = Buffer.byteLength(json, 'utf8');
4
- const ts = new Date().toISOString();
5
- // Emit batch_created plain entry
6
- deps.bus.emitPlainEntry({ ts, kind: 'batch_created', fields: { batch_id: batchId, route } });
7
- // Emit request_received plain entry
8
- const inline = bodyBytes <= deps.logWriter.inlineBodyLimit();
9
- const fields = { batch_id: batchId, route, body_bytes: bodyBytes };
10
- if (inline) {
11
- fields.body = json;
12
- }
13
- else {
14
- const spilled = await deps.logWriter.spillRequestBody({ batchId, body: parsed });
15
- fields.body_path = spilled.path;
16
- fields.body_bytes = spilled.bytes;
17
- }
18
- deps.bus.emitPlainEntry({ ts, kind: 'request_received', fields });
19
- }
20
- //# sourceMappingURL=request-observability.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-observability.js","sourceRoot":"","sources":["../../src/http/request-observability.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAA6B,EAC7B,OAAe,EACf,KAAa,EACb,MAAe;IAEf,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEpC,iCAAiC;IACjC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAE7F,oCAAoC;IACpC,MAAM,MAAM,GAAG,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;IAC7D,MAAM,MAAM,GAAqD,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IACrH,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;QAChC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC;AACpE,CAAC"}
@@ -1,16 +0,0 @@
1
- import type { IncomingMessage, ServerResponse } from 'node:http';
2
- import type { ServerConfig } from '@zhixuan92/multi-model-agent-core';
3
- import { RouteDispatcher } from '@zhixuan92/multi-model-agent-core';
4
- import type { RawHandler } from './types.js';
5
- export declare function setDraining(d: boolean): void;
6
- export declare function isDraining(): boolean;
7
- export interface PipelineConfig {
8
- loopbackOnlyPaths: ReadonlySet<string>;
9
- authExemptPaths: ReadonlySet<string>;
10
- cwdRequiredPaths: ReadonlySet<string>;
11
- /** Routes that REQUIRE X-MMA-Main-Model header. Tool dispatches must
12
- * attribute to a main model so wire telemetry's main_model is never null. */
13
- mainModelRequiredPaths: ReadonlySet<string>;
14
- }
15
- export declare function handleRequest(router: RouteDispatcher<RawHandler>, token: string, req: IncomingMessage, res: ServerResponse, cfg: ServerConfig, pipelineCfg: PipelineConfig): Promise<void>;
16
- //# sourceMappingURL=request-pipeline.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-pipeline.d.ts","sourceRoot":"","sources":["../../src/http/request-pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAQpE,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,YAAY,CAAC;AAS7D,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAsB;AACnE,wBAAgB,UAAU,IAAI,OAAO,CAAyB;AAE9D,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC;kFAC8E;IAC9E,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,cAAc,GAC1B,OAAO,CAAC,IAAI,CAAC,CAuJf"}
@@ -1,144 +0,0 @@
1
- import { sendError } from './errors.js';
2
- import { readBody } from './middleware/body-reader.js';
3
- import { decompressBody } from './middleware/decompress.js';
4
- import { validateAuthHeader } from './auth.js';
5
- import { validateCwd } from './cwd-validator.js';
6
- import { isLoopbackAddress, isAllowedHostHeader } from '@zhixuan92/multi-model-agent-core';
7
- import { resolveCallerIdentity } from './middleware/caller-identity.js';
8
- const BODY_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
9
- // Daemon-wide draining flag — set true by the cleanupSignal handler when
10
- // SIGTERM/SIGINT fires. New dispatches refuse with 503 service_unavailable
11
- // while shutdown drains in-flight tasks. /health is allowed through so
12
- // operators can confirm the daemon is winding down.
13
- let drainingMode = false;
14
- export function setDraining(d) { drainingMode = d; }
15
- export function isDraining() { return drainingMode; }
16
- export async function handleRequest(router, token, req, res, cfg, pipelineCfg) {
17
- const method = req.method ?? 'GET';
18
- const rawUrl = req.url ?? '/';
19
- // ── Step 0: draining check ────────────────────────────────────────────────
20
- // Once SIGTERM/SIGINT fires and cleanupSignal calls setDraining(true), new
21
- // dispatches refuse with 503 so in-flight tasks can drain cleanly. /health
22
- // stays available so operators can confirm the daemon is winding down.
23
- if (drainingMode && !rawUrl.startsWith('/health')) {
24
- sendError(res, 503, 'service_unavailable', 'daemon is draining; retry after restart');
25
- return;
26
- }
27
- // ── Step 1: Body size cap ──────────────────────────────────────────────────
28
- let rawBody;
29
- if (BODY_METHODS.has(method)) {
30
- const result = await readBody(req, cfg.server.limits.maxBodyBytes);
31
- if (!result.ok) {
32
- res.writeHead(413, { 'content-type': 'application/json', 'connection': 'close' });
33
- res.end(JSON.stringify({ error: { code: 'payload_too_large', message: `Request body exceeds the ${cfg.server.limits.maxBodyBytes}-byte limit` } }), () => { req.socket?.destroy(); });
34
- return;
35
- }
36
- rawBody = result.body;
37
- }
38
- // ── Step 2: Route match ────────────────────────────────────────────────────
39
- const match = router.match(method, rawUrl);
40
- if (!match) {
41
- const allowed = router.methodsFor(rawUrl);
42
- if (allowed.length > 0) {
43
- sendError(res, 405, 'method_not_allowed', `Method ${method} not allowed`, { allowed });
44
- }
45
- else {
46
- sendError(res, 404, 'not_found', `Unknown path ${rawUrl.split('?')[0]}`);
47
- }
48
- return;
49
- }
50
- // ── Step 3: Loopback & rebinding guard ─────────────────────────────────────
51
- const pathname = rawUrl.split('?')[0];
52
- // (a) Host-header rebinding check — ALL routes. Defends against DNS rebinding:
53
- // the connection is loopback (IP check passes) but the Host header is an
54
- // attacker-controlled domain. Only literal loopback host forms are allowed.
55
- if (!isAllowedHostHeader(req.headers.host)) {
56
- sendError(res, 403, 'forbidden_host', 'Request Host header is not an allowed loopback host');
57
- return;
58
- }
59
- // (b) IP-level loopback check — loopbackOnlyPaths only.
60
- if (pipelineCfg.loopbackOnlyPaths.has(pathname)) {
61
- const remoteAddr = req.socket?.remoteAddress;
62
- if (!isLoopbackAddress(remoteAddr)) {
63
- sendError(res, 403, 'loopback_only', 'This endpoint is only accessible from the loopback interface');
64
- return;
65
- }
66
- }
67
- // ── Step 4: Bearer auth ────────────────────────────────────────────────────
68
- if (!pipelineCfg.authExemptPaths.has(pathname)) {
69
- const header = req.headers['authorization'];
70
- const authResult = validateAuthHeader(header, token);
71
- if (!authResult.ok) {
72
- sendError(res, 401, 'unauthorized', 'Valid Bearer token required');
73
- return;
74
- }
75
- }
76
- // ── Step 5: Decompress body ─────────────────────────────────────────────────
77
- if (rawBody !== undefined && rawBody.length > 0) {
78
- const enc = req.headers['content-encoding'];
79
- if (enc !== undefined) {
80
- const result = await decompressBody(rawBody, enc, {
81
- maxDecompressedBytes: cfg.server.limits.maxBodyBytes,
82
- });
83
- if (!result.ok) {
84
- sendError(res, result.statusCode, result.reason, result.message);
85
- return;
86
- }
87
- rawBody = result.body;
88
- }
89
- }
90
- // ── Step 6: JSON body parse ────────────────────────────────────────────────
91
- let parsedBody;
92
- if (rawBody !== undefined && rawBody.length > 0) {
93
- try {
94
- parsedBody = JSON.parse(rawBody.toString('utf8'));
95
- }
96
- catch {
97
- sendError(res, 400, 'invalid_json', 'Request body is not valid JSON');
98
- return;
99
- }
100
- }
101
- // ── Step 7: cwd query param validation ─────────────────────────────────────
102
- let cwdValue;
103
- const urlObj = new URL(rawUrl, 'http://localhost');
104
- const requiresCwd = pipelineCfg.cwdRequiredPaths.has(pathname) ||
105
- pathname === '/context-blocks' ||
106
- /^\/context-blocks\//.test(pathname);
107
- if (requiresCwd) {
108
- const cwdParam = urlObj.searchParams.get('cwd') ?? undefined;
109
- const cwdResult = validateCwd(cwdParam);
110
- if (!cwdResult.ok) {
111
- const statusCode = cwdResult.error === 'forbidden_cwd' ? 403 : 400;
112
- sendError(res, statusCode, cwdResult.error, cwdResult.message);
113
- return;
114
- }
115
- cwdValue = cwdResult.canonicalCwd;
116
- }
117
- // ── Step 8: Caller identity from headers ────────────────────────────────────
118
- const identity = resolveCallerIdentity(req);
119
- if (pipelineCfg.mainModelRequiredPaths.has(pathname)) {
120
- if (identity.callerClient === 'other') {
121
- sendError(res, 400, 'client_required', 'X-MMA-Client header is required on tool routes. Set it to one of: claude-code, cursor, codex-cli, gemini-cli.');
122
- return;
123
- }
124
- // Auto-detect was unreliable: the claude-agent-sdk used by our own
125
- // claude-tier workers writes JSONL files into the same project slug,
126
- // and the resolver would pick those up (e.g. haiku) as the "main"
127
- // model. The header must come from the calling client.
128
- if (!identity.mainModel) {
129
- sendError(res, 400, 'main_model_required', 'X-MMA-Main-Model header is required on tool routes. Set it to the calling agent\'s model id (e.g. claude-opus-4-7, gpt-5.4).');
130
- return;
131
- }
132
- }
133
- // ── Step 9: Hand off to matched handler ────────────────────────────────────
134
- const ctx = {
135
- url: urlObj,
136
- cwd: cwdValue,
137
- body: parsedBody,
138
- authed: !pipelineCfg.authExemptPaths.has(pathname),
139
- callerClient: identity.callerClient,
140
- mainModel: identity.mainModel,
141
- };
142
- await match.handler(req, res, match.params, ctx);
143
- }
144
- //# sourceMappingURL=request-pipeline.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-pipeline.js","sourceRoot":"","sources":["../../src/http/request-pipeline.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAGxE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEjE,yEAAyE;AACzE,2EAA2E;AAC3E,uEAAuE;AACvE,oDAAoD;AACpD,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,MAAM,UAAU,WAAW,CAAC,CAAU,IAAU,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;AACnE,MAAM,UAAU,UAAU,KAAc,OAAO,YAAY,CAAC,CAAC,CAAC;AAW9D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAmC,EACnC,KAAa,EACb,GAAoB,EACpB,GAAmB,EACnB,GAAiB,EACjB,WAA2B;IAE3B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;IAE9B,6EAA6E;IAC7E,2EAA2E;IAC3E,2EAA2E;IAC3E,uEAAuE;IACvE,IAAI,YAAY,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,qBAAqB,EAAE,yCAAyC,CAAC,CAAC;QACtF,OAAO;IACT,CAAC;IAED,8EAA8E;IAC9E,IAAI,OAA2B,CAAC;IAChC,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;YAClF,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,4BAA4B,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,aAAa,EAAE,EAAE,CAAC,EAC1I,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CACjC,CAAC;YACF,OAAO;QACT,CAAC;QACD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,8EAA8E;IAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,EAAE,UAAU,MAAM,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzF,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,gBAAgB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO;IACT,CAAC;IAED,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACvC,+EAA+E;IAC/E,yEAAyE;IACzE,4EAA4E;IAC5E,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,gBAAgB,EAAE,qDAAqD,CAAC,CAAC;QAC7F,OAAO;IACT,CAAC;IACD,wDAAwD;IACxD,IAAI,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;QAC7C,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,8DAA8D,CAAC,CAAC;YACrG,OAAO;QACT,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,EAAE,6BAA6B,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC5C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE;gBAChD,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY;aACrD,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBACjE,OAAO;YACT,CAAC;YACD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,IAAI,UAAmB,CAAC;IACxB,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,EAAE,gCAAgC,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,IAAI,QAA4B,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC5D,QAAQ,KAAK,iBAAiB;QAC9B,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;QAC7D,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACnE,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC;IACpC,CAAC;IAED,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAE5C,IAAI,WAAW,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,IAAI,QAAQ,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;YACtC,SAAS,CACP,GAAG,EACH,GAAG,EACH,iBAAiB,EACjB,+GAA+G,CAChH,CAAC;YACF,OAAO;QACT,CAAC;QACD,mEAAmE;QACnE,qEAAqE;QACrE,kEAAkE;QAClE,uDAAuD;QACvD,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxB,SAAS,CACP,GAAG,EACH,GAAG,EACH,qBAAqB,EACrB,8HAA8H,CAC/H,CAAC;YACF,OAAO;QACT,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,MAAM,GAAG,GAAmB;QAC1B,GAAG,EAAE,MAAM;QACX,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClD,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAC;IAEF,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC"}
@@ -1,17 +0,0 @@
1
- import type { ServerConfig, BatchRegistry } from '@zhixuan92/multi-model-agent-core';
2
- import type { ProjectRegistry } from './project-registry.js';
3
- export declare const SERVER_VERSION: string;
4
- export interface RunningServer {
5
- port: number;
6
- /** The resolved address the server is bound to. Used by CLI to log the actual listen address. */
7
- serverAddress: string | null;
8
- stop(): Promise<void>;
9
- /** Shared BatchRegistry — exposed for testing and introspection handlers. */
10
- batchRegistry: BatchRegistry;
11
- /** Shared ProjectRegistry — exposed for testing and introspection handlers. */
12
- projectRegistry: ProjectRegistry;
13
- /** Wall-clock ms when the server finished starting (Date.now()). Used for uptimeMs in /status. */
14
- serverStartedAt: number;
15
- }
16
- export declare function startServer(config: ServerConfig, injectedManifestSync?: import('../skill-install/skill-manifest-sync.js').SkillManifestSync): Promise<RunningServer>;
17
- //# sourceMappingURL=server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAWrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAiB7D,eAAO,MAAM,cAAc,QAAsB,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,iGAAiG;IACjG,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,6EAA6E;IAC7E,aAAa,EAAE,aAAa,CAAC;IAC7B,+EAA+E;IAC/E,eAAe,EAAE,eAAe,CAAC;IACjC,kGAAkG;IAClG,eAAe,EAAE,MAAM,CAAC;CACzB;AAoND,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,oBAAoB,CAAC,EAAE,OAAO,yCAAyC,EAAE,iBAAiB,GACzF,OAAO,CAAC,aAAa,CAAC,CA+ExB"}
@@ -1,300 +0,0 @@
1
- import { HTTPListener } from '@zhixuan92/multi-model-agent-core';
2
- import { readFileSync } from 'node:fs';
3
- import { fileURLToPath } from 'node:url';
4
- import { join, dirname } from 'node:path';
5
- import { homedir } from 'node:os';
6
- import { RouteDispatcher } from '@zhixuan92/multi-model-agent-core';
7
- import { EnvelopeBus } from '@zhixuan92/multi-model-agent-core/events/envelope-bus';
8
- import { LogWriter } from '@zhixuan92/multi-model-agent-core/events/log-writer';
9
- import { TelemetryUploader } from '@zhixuan92/multi-model-agent-core/events/telemetry-uploader';
10
- import { StderrLogSubscriber } from '@zhixuan92/multi-model-agent-core/events/stderr-log-subscriber';
11
- import { decideConsent } from '@zhixuan92/multi-model-agent-core/events/consent-rules';
12
- import { sendError, sendJson } from './errors.js';
13
- import { loadToken } from './auth.js';
14
- import { handleRequest } from './request-pipeline.js';
15
- import { getRecorder } from '../telemetry/recorder.js';
16
- /** Server package version — read once at module load time from package.json. */
17
- function readServerVersion() {
18
- try {
19
- const thisDir = dirname(fileURLToPath(import.meta.url));
20
- // Walk up from src/http/ to packages/server/
21
- const pkgPath = join(thisDir, '..', '..', 'package.json');
22
- const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
23
- return pkg.version ?? '0.0.0';
24
- }
25
- catch {
26
- return '0.0.0';
27
- }
28
- }
29
- export const SERVER_VERSION = readServerVersion();
30
- /** Routes where the loopback guard is enforced. */
31
- const LOOPBACK_ONLY_PATHS = new Set(['/health', '/status']);
32
- /** Routes that do NOT require bearer auth. */
33
- const AUTH_EXEMPT_PATHS = new Set(['/health']);
34
- /** Routes that require a `cwd` query parameter (validated by cwd-validator middleware). */
35
- const CWD_REQUIRED_PATHS = new Set([
36
- '/delegate', '/audit', '/review', '/debug', '/execute-plan', '/retry', '/investigate', '/research', '/journal-record', '/journal-recall',
37
- '/control/batch-slice', '/context-blocks',
38
- ]);
39
- /** Routes that require the X-MMA-Main-Model header. Enforced at request boundary
40
- * so wire telemetry's main_model column is never null for billed runs. The
41
- * tool routes need it; the introspection / batch-polling / context-block
42
- * utility routes do not. */
43
- const MAIN_MODEL_REQUIRED_PATHS = new Set([
44
- '/delegate', '/audit', '/review', '/debug', '/execute-plan', '/retry', '/investigate', '/research', '/journal-record', '/journal-recall',
45
- ]);
46
- /**
47
- * Registers tool handlers (POST /delegate, /audit, /review, /debug, /execute-plan, /retry).
48
- * Builds a ToolSurfaceRegistry by calling each tool-config's registerXxx, then
49
- * iterates `registry.list()` filtered to `surface: 'tool'` entries to drive
50
- * route registration. The registry is the canonical source for tool surface
51
- * metadata (httpMethod, httpPath, schema, toolCategory).
52
- */
53
- async function registerToolHandlers(router, config, batchRegistry, projectRegistry) {
54
- const { buildToolSurfaceRegistry } = await import('@zhixuan92/multi-model-agent-core');
55
- const surface = buildToolSurfaceRegistry();
56
- // For tool handlers, we need MultiModelConfig which is part of ServerConfig only
57
- // when the full mmagent.config.json is loaded. In test/minimal configs that only
58
- // have `server:`, we create a stub config. Real CLI startup will load full config.
59
- const multiModelConfig = config.agents
60
- ? config
61
- : undefined;
62
- if (!multiModelConfig) {
63
- // Server started with server-only config (e.g. tests): register stubs that return 503.
64
- // Drive registration from the registry so adding a tool only requires a tool-config edit.
65
- for (const entry of surface.list()) {
66
- if (entry.surface !== 'tool')
67
- continue;
68
- router.register(entry.httpMethod, entry.httpPath, (_req, res, _params, _ctx) => {
69
- sendError(res, 503, 'no_agent_config', 'Server started without agent configuration; provide a full mmagent.config.json');
70
- });
71
- }
72
- return;
73
- }
74
- const bus = new EnvelopeBus();
75
- const logWriter = new LogWriter({ diagnosticsLog: multiModelConfig.diagnostics?.log ?? false, logDir: multiModelConfig.diagnostics?.logDir });
76
- bus.subscribe(logWriter);
77
- // Always-on stderr log stream — no quiet mode and no --verbose flag (4.7.3+).
78
- bus.subscribe(new StderrLogSubscriber());
79
- let recorderForBus = null;
80
- try {
81
- recorderForBus = getRecorder();
82
- }
83
- catch { /* not initialized */ }
84
- // decideConsent signature: read from packages/server/src/telemetry/consent.ts. Today it reads
85
- // process.env.MMAGENT_TELEMETRY + a config.json. Replicate that call here:
86
- const decideConsentForUploader = () => {
87
- const envVal = process.env.MMAGENT_TELEMETRY;
88
- let configState = undefined;
89
- try {
90
- const cfgPath = join(homedir(), '.multi-model', 'config.json');
91
- const cfg = JSON.parse(readFileSync(cfgPath, 'utf8'));
92
- if (cfg && typeof cfg === 'object' && cfg.telemetry && typeof cfg.telemetry === 'object' && typeof cfg.telemetry.enabled === 'boolean') {
93
- configState = { enabled: cfg.telemetry.enabled };
94
- }
95
- }
96
- catch (e) {
97
- if (e.code !== 'ENOENT') {
98
- configState = { kind: 'unreadable' };
99
- }
100
- }
101
- return decideConsent({ env: envVal, config: configState });
102
- };
103
- const uploader = new TelemetryUploader({
104
- recorder: recorderForBus,
105
- consent: { decide: decideConsentForUploader },
106
- buildOpts: (env) => ({
107
- toolMode: 'full', // default
108
- implementerModel: env.stages[0]?.model ?? env.mainModel,
109
- implementerTier: env.stages[0]?.tier ?? env.agentType,
110
- mainModelFamily: env.mainModel.split('-')[0] ?? 'unknown',
111
- }),
112
- });
113
- bus.subscribe(uploader);
114
- const deps = { config: multiModelConfig, bus, logWriter, projectRegistry, batchRegistry };
115
- // Per-tool handler builders, keyed by registry routeName. The registry tells
116
- // us WHICH route to register and at WHICH path/method; this map answers HOW
117
- // to build the per-tool handler.
118
- const { buildDelegateHandler } = await import('./handlers/tools/delegate.js');
119
- const { buildAuditHandler } = await import('./handlers/tools/audit.js');
120
- const { buildReviewHandler } = await import('./handlers/tools/review.js');
121
- const { buildDebugHandler } = await import('./handlers/tools/debug.js');
122
- const { buildExecutePlanHandler } = await import('./handlers/tools/execute-plan.js');
123
- const { buildRetryHandler } = await import('./handlers/tools/retry.js');
124
- const { buildInvestigateHandler } = await import('./handlers/tools/investigate.js');
125
- const { buildResearchHandler } = await import('./handlers/tools/research.js');
126
- const { buildJournalRecordHandler } = await import('./handlers/tools/journal-record.js');
127
- const { buildJournalRecallHandler } = await import('./handlers/tools/journal-recall.js');
128
- const builders = {
129
- delegate: buildDelegateHandler,
130
- audit: buildAuditHandler,
131
- review: buildReviewHandler,
132
- debug: buildDebugHandler,
133
- execute_plan: buildExecutePlanHandler,
134
- retry_tasks: buildRetryHandler,
135
- investigate: buildInvestigateHandler,
136
- research: buildResearchHandler,
137
- 'journal-record': buildJournalRecordHandler,
138
- 'journal-recall': buildJournalRecallHandler,
139
- };
140
- for (const entry of surface.list()) {
141
- if (entry.surface !== 'tool')
142
- continue;
143
- const builder = builders[entry.routeName];
144
- if (!builder) {
145
- // Route is in the registry but its handler hasn't been wired yet
146
- // (e.g. /research added in a prior task, handler lands in a later one).
147
- // Skip silently — the next task wires the handler and enables the route.
148
- continue;
149
- }
150
- router.register(entry.httpMethod, entry.httpPath, builder(deps));
151
- }
152
- }
153
- /**
154
- * Registers control handlers (GET /batch/:batchId, POST/DELETE /context-blocks).
155
- */
156
- async function registerControlHandlers(router, config, batchRegistry, projectRegistry) {
157
- const { buildBatchHandler } = await import('./handlers/control/batch.js');
158
- const { buildBatchSliceHandler } = await import('./handlers/control/batch-slice.js');
159
- const { buildCreateContextBlockHandler, buildDeleteContextBlockHandler } = await import('./handlers/control/context-blocks.js');
160
- const multiModelConfig = config.agents
161
- ? config
162
- : undefined;
163
- router.register('GET', '/batch/:batchId', buildBatchHandler({ batchRegistry }));
164
- if (multiModelConfig) {
165
- const bus = new EnvelopeBus();
166
- const logWriter = new LogWriter({ diagnosticsLog: multiModelConfig.diagnostics?.log ?? false, logDir: multiModelConfig.diagnostics?.logDir });
167
- bus.subscribe(logWriter);
168
- bus.subscribe(new StderrLogSubscriber());
169
- let recorderForBus = null;
170
- try {
171
- recorderForBus = getRecorder();
172
- }
173
- catch { /* not initialized */ }
174
- const decideConsentForUploader = () => {
175
- const envVal = process.env.MMAGENT_TELEMETRY;
176
- let configState = undefined;
177
- try {
178
- const cfgPath = join(homedir(), '.multi-model', 'config.json');
179
- const cfg = JSON.parse(readFileSync(cfgPath, 'utf8'));
180
- if (cfg && typeof cfg === 'object' && cfg.telemetry && typeof cfg.telemetry === 'object' && typeof cfg.telemetry.enabled === 'boolean') {
181
- configState = { enabled: cfg.telemetry.enabled };
182
- }
183
- }
184
- catch (e) {
185
- if (e.code !== 'ENOENT') {
186
- configState = { kind: 'unreadable' };
187
- }
188
- }
189
- return decideConsent({ env: envVal, config: configState });
190
- };
191
- const uploader = new TelemetryUploader({
192
- recorder: recorderForBus,
193
- consent: { decide: decideConsentForUploader },
194
- buildOpts: (env) => ({
195
- toolMode: 'full', // default
196
- implementerModel: env.stages[0]?.model ?? env.mainModel,
197
- implementerTier: env.stages[0]?.tier ?? env.agentType,
198
- mainModelFamily: env.mainModel.split('-')[0] ?? 'unknown',
199
- }),
200
- });
201
- bus.subscribe(uploader);
202
- const deps = { config: multiModelConfig, bus, logWriter, projectRegistry, batchRegistry };
203
- router.register('POST', '/control/batch-slice', buildBatchSliceHandler(deps));
204
- router.register('POST', '/context-blocks', buildCreateContextBlockHandler({
205
- projectRegistry,
206
- maxContextBlockBytes: multiModelConfig.server.limits.maxContextBlockBytes,
207
- maxContextBlocksPerProject: multiModelConfig.server.limits.maxContextBlocksPerProject,
208
- }));
209
- router.register('DELETE', '/context-blocks/:blockId', buildDeleteContextBlockHandler({ projectRegistry }));
210
- }
211
- else {
212
- router.register('POST', '/control/batch-slice', (_req, res) => {
213
- sendError(res, 503, 'no_agent_config', 'Server started without agent configuration; provide a full mmagent.config.json');
214
- });
215
- router.register('POST', '/context-blocks', (_req, res) => {
216
- sendError(res, 503, 'no_agent_config', 'Server started without agent configuration; provide a full mmagent.config.json');
217
- });
218
- router.register('DELETE', '/context-blocks/:blockId', buildDeleteContextBlockHandler({ projectRegistry }));
219
- }
220
- }
221
- export async function startServer(config, injectedManifestSync) {
222
- const token = loadToken(config.server.auth.tokenFile);
223
- const router = new RouteDispatcher();
224
- // ── Create shared registries ───────────────────────────────────────────────
225
- const { BatchRegistry } = await import('@zhixuan92/multi-model-agent-core');
226
- const { ProjectRegistry } = await import('./project-registry.js');
227
- const batchRegistry = new BatchRegistry({
228
- batchTtlMs: config.server.limits.batchTtlMs,
229
- });
230
- const projectRegistry = new ProjectRegistry({
231
- cap: config.server.limits.projectCap,
232
- idleEvictionMs: config.server.limits.idleProjectTimeoutMs,
233
- evictionIntervalMs: Math.min(config.server.limits.idleProjectTimeoutMs, 60_000),
234
- });
235
- // Capture serverStartedAt before health registration so /health can expose it.
236
- const serverStartedAt = Date.now();
237
- // GET /health — unauthenticated liveness + skill manifest drift check
238
- const { buildHealthHandler } = await import('./handlers/introspection/health.js');
239
- let skillManifestSync;
240
- if (injectedManifestSync) {
241
- skillManifestSync = injectedManifestSync;
242
- }
243
- else {
244
- try {
245
- const { makeSkillManifestSync } = await import('../skill-install/skill-manifest-sync.js');
246
- const { discoverPerClientInstallDirs } = await import('../skill-install/discover.js');
247
- skillManifestSync = makeSkillManifestSync(discoverPerClientInstallDirs());
248
- }
249
- catch {
250
- skillManifestSync = { driftReport: () => [] };
251
- }
252
- }
253
- router.register('GET', '/health', buildHealthHandler({ manifestSync: skillManifestSync }));
254
- // Register tool handlers (Phase 6)
255
- await registerToolHandlers(router, config, batchRegistry, projectRegistry);
256
- // Register control handlers (Phase 7)
257
- await registerControlHandlers(router, config, batchRegistry, projectRegistry);
258
- // GET /status — operator introspection (registered after registries are ready)
259
- const { buildStatusHandler } = await import('./handlers/introspection/status.js');
260
- router.register('GET', '/status', buildStatusHandler({
261
- batchRegistry,
262
- projectRegistry,
263
- serverStartedAt,
264
- bind: config.server.bind,
265
- version: SERVER_VERSION,
266
- }));
267
- // Test-only: enumerates registered routes. Guarded by env; zero impact on production.
268
- if (process.env.MMAGENT_TEST_INTROSPECTION === '1') {
269
- router.register('GET', '/__routes', (_req, res) => {
270
- sendJson(res, 200, router.listRoutes().map((route) => ({
271
- method: route.method.toUpperCase(),
272
- path: route.path,
273
- })));
274
- });
275
- }
276
- const listener = new HTTPListener({
277
- bind: config.server.bind,
278
- port: config.server.port,
279
- handler: (req, res) => handleRequest(router, token, req, res, config, PIPELINE_CFG),
280
- });
281
- const { port, address: serverAddress } = await listener.start();
282
- return {
283
- port,
284
- serverAddress,
285
- stop: () => listener.stop(),
286
- batchRegistry,
287
- projectRegistry,
288
- serverStartedAt,
289
- };
290
- }
291
- // Per-request pipeline lives in request-pipeline.ts. server.ts owns routing
292
- // table + bootstrap; the pipeline owns body-cap → route → loopback → auth →
293
- // JSON parse → cwd → dispatch.
294
- const PIPELINE_CFG = {
295
- loopbackOnlyPaths: LOOPBACK_ONLY_PATHS,
296
- authExemptPaths: AUTH_EXEMPT_PATHS,
297
- cwdRequiredPaths: CWD_REQUIRED_PATHS,
298
- mainModelRequiredPaths: MAIN_MODEL_REQUIRED_PATHS,
299
- };
300
- //# sourceMappingURL=server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import type { IncomingMessage, ServerResponse } from 'node:http';
2
- import type { CallerClient } from './middleware/caller-identity.js';
3
- export interface RequestContext {
4
- url: URL;
5
- cwd?: string;
6
- body?: unknown;
7
- authed: boolean;
8
- callerClient: CallerClient;
9
- /** Calling agent's model id from x-mma-main-model header (null if absent). */
10
- mainModel: string | null;
11
- }
12
- export type Handler = (ctx: RequestContext, res: ServerResponse, params: Record<string, string>) => Promise<void> | void;
13
- /**
14
- * Raw handler shape used by the C1 RouteDispatcher inside the server.
15
- * Server-specific because it carries RequestContext (caller identity, cwd, body).
16
- * The core RouteDispatcher is generic; this is the concrete H instantiation
17
- * the server registers.
18
- */
19
- export type RawHandler = (req: IncomingMessage, res: ServerResponse, params: Record<string, string>, ctx: RequestContext) => Promise<void> | void;
20
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/http/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,GAAG,CAAC;IACT,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,8EAA8E;IAC9E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzH;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,CACvB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/http/types.ts"],"names":[],"mappings":""}
@@ -1,35 +0,0 @@
1
- import { z } from 'zod';
2
- import { type Client } from './manifest.js';
3
- declare const disabledStateSchema: z.ZodObject<{
4
- version: z.ZodLiteral<1>;
5
- disabledAt: z.ZodNumber;
6
- cliVersion: z.ZodString;
7
- targets: z.ZodArray<z.ZodEnum<{
8
- gemini: "gemini";
9
- "claude-code": "claude-code";
10
- cursor: "cursor";
11
- codex: "codex";
12
- }>>;
13
- }, z.core.$strip>;
14
- export type DisabledState = z.infer<typeof disabledStateSchema>;
15
- /** Full path to the sentinel file. */
16
- export declare function disabledStatePath(homeDir?: string): string;
17
- /**
18
- * Read and validate the sentinel. Returns null when absent, unreadable, or
19
- * structurally invalid — a malformed sentinel must never wedge sync-skills.
20
- */
21
- export declare function readDisabledState(homeDir?: string): DisabledState | null;
22
- /** The set of currently-disabled clients (empty when the sentinel is absent). */
23
- export declare function disabledTargets(homeDir?: string): Client[];
24
- /**
25
- * Mark `targets` as disabled, unioned with any already-disabled clients.
26
- * Returns the resulting disabled set (stable ALL_CLIENTS order).
27
- */
28
- export declare function addDisabledTargets(homeDir: string | undefined, targets: Client[], cliVersion: string): Client[];
29
- /**
30
- * Clear `targets` from the disabled set. Deletes the sentinel file entirely
31
- * once nothing remains disabled. Returns the still-disabled set.
32
- */
33
- export declare function clearDisabledTargets(homeDir: string | undefined, targets: Client[]): Client[];
34
- export {};
35
- //# sourceMappingURL=disabled-state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"disabled-state.d.ts","sourceRoot":"","sources":["../../src/skill-install/disabled-state.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAQtE,QAAA,MAAM,mBAAmB;;;;;;;;;;iBAKvB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,sCAAsC;AACtC,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQxE;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAWV;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAgB7F"}