@brutalist/mcp 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +26 -0
  2. package/dist/brutalist-server.d.ts +31 -9
  3. package/dist/brutalist-server.d.ts.map +1 -1
  4. package/dist/brutalist-server.js +107 -673
  5. package/dist/brutalist-server.js.map +1 -1
  6. package/dist/cli-adapters/claude-adapter.d.ts +25 -0
  7. package/dist/cli-adapters/claude-adapter.d.ts.map +1 -0
  8. package/dist/cli-adapters/claude-adapter.js +245 -0
  9. package/dist/cli-adapters/claude-adapter.js.map +1 -0
  10. package/dist/cli-adapters/codex-adapter.d.ts +23 -0
  11. package/dist/cli-adapters/codex-adapter.d.ts.map +1 -0
  12. package/dist/cli-adapters/codex-adapter.js +173 -0
  13. package/dist/cli-adapters/codex-adapter.js.map +1 -0
  14. package/dist/cli-adapters/gemini-adapter.d.ts +50 -0
  15. package/dist/cli-adapters/gemini-adapter.d.ts.map +1 -0
  16. package/dist/cli-adapters/gemini-adapter.js +196 -0
  17. package/dist/cli-adapters/gemini-adapter.js.map +1 -0
  18. package/dist/cli-adapters/index.d.ts +75 -0
  19. package/dist/cli-adapters/index.d.ts.map +1 -0
  20. package/dist/cli-adapters/index.js +29 -0
  21. package/dist/cli-adapters/index.js.map +1 -0
  22. package/dist/cli-adapters/shared.d.ts +12 -0
  23. package/dist/cli-adapters/shared.d.ts.map +1 -0
  24. package/dist/cli-adapters/shared.js +99 -0
  25. package/dist/cli-adapters/shared.js.map +1 -0
  26. package/dist/cli-agents.d.ts +64 -2
  27. package/dist/cli-agents.d.ts.map +1 -1
  28. package/dist/cli-agents.js +417 -401
  29. package/dist/cli-agents.js.map +1 -1
  30. package/dist/debate/constitutional.d.ts +27 -0
  31. package/dist/debate/constitutional.d.ts.map +1 -0
  32. package/dist/debate/constitutional.js +74 -0
  33. package/dist/debate/constitutional.js.map +1 -0
  34. package/dist/debate/debate-orchestrator.d.ts +154 -0
  35. package/dist/debate/debate-orchestrator.d.ts.map +1 -0
  36. package/dist/debate/debate-orchestrator.js +699 -0
  37. package/dist/debate/debate-orchestrator.js.map +1 -0
  38. package/dist/debate/index.d.ts +18 -0
  39. package/dist/debate/index.d.ts.map +1 -0
  40. package/dist/debate/index.js +18 -0
  41. package/dist/debate/index.js.map +1 -0
  42. package/dist/debate/refusal-detection.d.ts +27 -0
  43. package/dist/debate/refusal-detection.d.ts.map +1 -0
  44. package/dist/debate/refusal-detection.js +62 -0
  45. package/dist/debate/refusal-detection.js.map +1 -0
  46. package/dist/debate/synthesis.d.ts +22 -0
  47. package/dist/debate/synthesis.d.ts.map +1 -0
  48. package/dist/debate/synthesis.js +117 -0
  49. package/dist/debate/synthesis.js.map +1 -0
  50. package/dist/logger.d.ts +204 -1
  51. package/dist/logger.d.ts.map +1 -1
  52. package/dist/logger.js +398 -18
  53. package/dist/logger.js.map +1 -1
  54. package/dist/metrics/counter.d.ts +24 -0
  55. package/dist/metrics/counter.d.ts.map +1 -0
  56. package/dist/metrics/counter.js +60 -0
  57. package/dist/metrics/counter.js.map +1 -0
  58. package/dist/metrics/histogram.d.ts +42 -0
  59. package/dist/metrics/histogram.d.ts.map +1 -0
  60. package/dist/metrics/histogram.js +114 -0
  61. package/dist/metrics/histogram.js.map +1 -0
  62. package/dist/metrics/index.d.ts +26 -0
  63. package/dist/metrics/index.d.ts.map +1 -0
  64. package/dist/metrics/index.js +22 -0
  65. package/dist/metrics/index.js.map +1 -0
  66. package/dist/metrics/registry.d.ts +96 -0
  67. package/dist/metrics/registry.d.ts.map +1 -0
  68. package/dist/metrics/registry.js +113 -0
  69. package/dist/metrics/registry.js.map +1 -0
  70. package/dist/metrics/safe-metric.d.ts +25 -0
  71. package/dist/metrics/safe-metric.d.ts.map +1 -0
  72. package/dist/metrics/safe-metric.js +41 -0
  73. package/dist/metrics/safe-metric.js.map +1 -0
  74. package/dist/metrics/types.d.ts +82 -0
  75. package/dist/metrics/types.d.ts.map +1 -0
  76. package/dist/metrics/types.js +121 -0
  77. package/dist/metrics/types.js.map +1 -0
  78. package/dist/registry/argument-spaces.d.ts.map +1 -1
  79. package/dist/registry/argument-spaces.js +20 -0
  80. package/dist/registry/argument-spaces.js.map +1 -1
  81. package/dist/registry/domains.d.ts.map +1 -1
  82. package/dist/registry/domains.js +17 -1
  83. package/dist/registry/domains.js.map +1 -1
  84. package/dist/streaming/circuit-breaker.d.ts +13 -1
  85. package/dist/streaming/circuit-breaker.d.ts.map +1 -1
  86. package/dist/streaming/circuit-breaker.js +13 -1
  87. package/dist/streaming/circuit-breaker.js.map +1 -1
  88. package/dist/streaming/intelligent-buffer.d.ts +13 -1
  89. package/dist/streaming/intelligent-buffer.d.ts.map +1 -1
  90. package/dist/streaming/intelligent-buffer.js +13 -1
  91. package/dist/streaming/intelligent-buffer.js.map +1 -1
  92. package/dist/streaming/output-parser.d.ts +16 -2
  93. package/dist/streaming/output-parser.d.ts.map +1 -1
  94. package/dist/streaming/output-parser.js +16 -2
  95. package/dist/streaming/output-parser.js.map +1 -1
  96. package/dist/streaming/progress-tracker.d.ts +14 -1
  97. package/dist/streaming/progress-tracker.d.ts.map +1 -1
  98. package/dist/streaming/progress-tracker.js +14 -1
  99. package/dist/streaming/progress-tracker.js.map +1 -1
  100. package/dist/streaming/session-manager.d.ts +14 -1
  101. package/dist/streaming/session-manager.d.ts.map +1 -1
  102. package/dist/streaming/session-manager.js +14 -1
  103. package/dist/streaming/session-manager.js.map +1 -1
  104. package/dist/streaming/sse-transport.d.ts +12 -1
  105. package/dist/streaming/sse-transport.d.ts.map +1 -1
  106. package/dist/streaming/sse-transport.js +12 -1
  107. package/dist/streaming/sse-transport.js.map +1 -1
  108. package/dist/streaming/streaming-orchestrator.d.ts +15 -1
  109. package/dist/streaming/streaming-orchestrator.d.ts.map +1 -1
  110. package/dist/streaming/streaming-orchestrator.js +15 -1
  111. package/dist/streaming/streaming-orchestrator.js.map +1 -1
  112. package/dist/system-prompts.d.ts.map +1 -1
  113. package/dist/system-prompts.js +490 -4
  114. package/dist/system-prompts.js.map +1 -1
  115. package/dist/tool-definitions-generated.d.ts.map +1 -1
  116. package/dist/tool-definitions-generated.js +3 -1
  117. package/dist/tool-definitions-generated.js.map +1 -1
  118. package/package.json +1 -1
package/README.md CHANGED
@@ -210,6 +210,8 @@ Features:
210
210
  | `roast_security` | Attack vectors, authentication, authorization |
211
211
  | `roast_product` | UX, adoption barriers, user needs |
212
212
  | `roast_infrastructure` | Reliability, scaling, operational overhead |
213
+ | `roast_design` | Perceptual craft, typography, affordances (Playwright for live UIs) |
214
+ | `roast_legal` | Authority, application, adversary, procedure, interpretation, risk |
213
215
 
214
216
  ### Utilities
215
217
 
@@ -244,6 +246,30 @@ Different agents have different strengths:
244
246
  - **Security**: Codex, Claude, Gemini
245
247
  - **Research**: Claude, Gemini, Codex
246
248
 
249
+ ### Verification-Heavy Domains
250
+
251
+ `legal`, `research`, and `security` ship with a mandatory verification protocol. Before citing any external authority (case, statute, study, CVE, advisory), agents must invoke their native web tools, lift a verbatim quote from the source, and tag the citation with one of:
252
+
253
+ - `[VERIFIED: <url> | "<verbatim quote supporting the attribution>"]`
254
+ - `[SUPPLIED: <location> | "<verbatim quote from supplied materials>"]`
255
+ - `[UNVERIFIED: <reason>]` — verification failed; no quote
256
+
257
+ Untagged citations are a protocol violation. The "state doctrine without a cite" fallback is conditional on a failed web lookup, not a parallel option. Consumers of the critique can spot-check citations by fetching the URL and grepping for the quoted string.
258
+
259
+ ### Gemini Frontier Model Rotation
260
+
261
+ For Gemini, the server pins `gemini-3.1-pro-preview` as the default to prevent the CLI's Auto router from downselecting to `gemini-2.5-flash-lite` under verification load. When the preview tier is saturated (429 / "No capacity available"), the orchestrator automatically rotates through the frontier chain:
262
+
263
+ 1. `gemini-3.1-pro-preview` (newest frontier)
264
+ 2. `gemini-3-pro-preview` (previous frontier)
265
+ 3. `gemini-2.5-pro` (stable last-gen frontier)
266
+
267
+ Overrides:
268
+ - Per-call: `roast(..., models={gemini: "gemini-2.5-flash"})` — caller chooses, no rotation.
269
+ - Per-environment: `BRUTALIST_GEMINI_MODEL=gemini-2.5-pro` — operator chooses, no rotation.
270
+
271
+ Rotation only fires on saturation signals (rate/usage/quota). Non-saturation failures (auth, subprocess, prompt errors) abort rotation immediately.
272
+
247
273
  ## Why Multiple Perspectives
248
274
 
249
275
  Each CLI agent brings a different approach to analysis:
@@ -1,4 +1,5 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { MetricsRegistry } from './metrics/index.js';
2
3
  import { BrutalistServerConfig } from './types/brutalist.js';
3
4
  /**
4
5
  * BrutalistServer - Composition root for the Brutalist MCP Server
@@ -8,15 +9,38 @@ import { BrutalistServerConfig } from './types/brutalist.js';
8
9
  * - ResponseFormatter: Handles all response formatting and pagination
9
10
  * - HttpTransport: Manages HTTP server and CORS
10
11
  * - ToolHandler: Handles roast tool execution, caching, and conversation continuation
12
+ * - DebateOrchestrator: Debate orchestration with 3-tier escalation (src/debate/)
11
13
  */
12
14
  export declare class BrutalistServer {
13
15
  server: McpServer;
14
16
  config: BrutalistServerConfig;
15
- private cliOrchestrator;
17
+ private _cliOrchestrator;
16
18
  private responseCache;
17
19
  private formatter;
18
20
  private toolHandler;
21
+ private debateOrchestrator;
19
22
  private httpTransport?;
23
+ /**
24
+ * Observability: a single MetricsRegistry per BrutalistServer instance
25
+ * (not a module-level singleton — two BrutalistServers produce two
26
+ * independent registries, which keeps tests deterministic). Shared
27
+ * with DebateOrchestrator and CLIAgentOrchestrator; consumed by the
28
+ * streaming fan-out at handleStreamingEvent.
29
+ */
30
+ protected readonly metrics: MetricsRegistry;
31
+ /**
32
+ * Per-subsystem scoped loggers bound at construction time. The module
33
+ * label is fixed at construction; sub-call sites narrow the operation
34
+ * label via `.forOperation(...)`. Bindings:
35
+ * - cliLog → module='cli-orchestrator', operation='spawn'
36
+ * - streamingLog → module='streaming', operation='dispatch'
37
+ * The debate scoped log is constructed inline at the DebateOrchestrator
38
+ * call site below (module='debate', operation='orchestrate').
39
+ */
40
+ private readonly cliLog;
41
+ private readonly streamingLog;
42
+ private get cliOrchestrator();
43
+ private set cliOrchestrator(value);
20
44
  private activeSessions;
21
45
  private readonly MAX_SESSIONS;
22
46
  private readonly SESSION_TTL_MS;
@@ -62,18 +86,16 @@ export declare class BrutalistServer {
62
86
  */
63
87
  private handleUnifiedRoast;
64
88
  /**
65
- * Handle debate tool execution with constitutional position anchoring.
66
- * Uses 2 randomly selected agents (or user-specified) with explicit PRO/CON positions.
89
+ * Thin delegation to DebateOrchestrator.handleDebateToolExecution().
90
+ * Preserved as a method on BrutalistServer so that existing tests using
91
+ * `(server as any).handleDebateToolExecution(...)` continue to work.
67
92
  */
68
93
  private handleDebateToolExecution;
69
94
  /**
70
- * Execute CLI debate with constitutional position anchoring.
71
- * 2 agents, explicit PRO/CON positions, context compression between rounds.
95
+ * Thin delegation to DebateOrchestrator.executeCLIDebate().
96
+ * Preserved as a method on BrutalistServer so that existing tests using
97
+ * `(server as any).executeCLIDebate(...)` continue to work.
72
98
  */
73
99
  private executeCLIDebate;
74
- /**
75
- * Synthesize debate results into formatted output
76
- */
77
- private synthesizeDebate;
78
100
  }
79
101
  //# sourceMappingURL=brutalist-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"brutalist-server.d.ts","sourceRoot":"","sources":["../src/brutalist-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,OAAO,EACL,qBAAqB,EAKtB,MAAM,sBAAsB,CAAC;AAmB9B;;;;;;;;GAQG;AACH,qBAAa,eAAe;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,qBAAqB,CAAC;IAGrC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,aAAa,CAAgB;IAGrC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAC,CAAgB;IAGtC,OAAO,CAAC,cAAc,CAIjB;IAGL,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IACtD,OAAO,CAAC,mBAAmB,CAAC,CAAiB;gBAEjC,MAAM,GAAE,qBAA0B;IA2DxC,KAAK;YAeG,gBAAgB;YAMhB,eAAe;IActB,aAAa,IAAI,MAAM,GAAG,SAAS;IAK7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;;OAGG;IACI,qBAAqB,IAAI,IAAI;IAcvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrC;;OAEG;IACH,OAAO,CAAC,oBAAoB,CAgE1B;IAEF;;OAEG;IACH,OAAO,CAAC,oBAAoB,CAwC1B;IAEF;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoO5B;;OAEG;YACW,kBAAkB;IAuEhC;;;OAGG;YACW,yBAAyB;IA8MvC;;;OAGG;YACW,gBAAgB;IA2d9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAuHzB"}
1
+ {"version":3,"file":"brutalist-server.d.ts","sourceRoot":"","sources":["../src/brutalist-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EACL,qBAAqB,EAGtB,MAAM,sBAAsB,CAAC;AAiB9B;;;;;;;;;GASG;AACH,qBAAa,eAAe;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,qBAAqB,CAAC;IAKrC,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,aAAa,CAAgB;IAGrC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAsB;IAChD,OAAO,CAAC,aAAa,CAAC,CAAgB;IAEtC;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAA2B;IAEtE;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAE5C,OAAO,KAAK,eAAe,GAE1B;IACD,OAAO,KAAK,eAAe,QAK1B;IAGD,OAAO,CAAC,cAAc,CAIjB;IAGL,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IACtD,OAAO,CAAC,mBAAmB,CAAC,CAAiB;gBAEjC,MAAM,GAAE,qBAA0B;IAsFxC,KAAK;YAeG,gBAAgB;YAMhB,eAAe;IActB,aAAa,IAAI,MAAM,GAAG,SAAS;IAK7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;;OAGG;IACI,qBAAqB,IAAI,IAAI;IAcvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrC;;OAEG;IACH,OAAO,CAAC,oBAAoB,CAgF1B;IAEF;;OAEG;IACH,OAAO,CAAC,oBAAoB,CAyC1B;IAEF;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAwO5B;;OAEG;YACW,kBAAkB;IA2EhC;;;;OAIG;YACW,yBAAyB;IAIvC;;;;OAIG;YACW,gBAAgB;CAG/B"}