@brutalist/mcp 1.8.1 → 1.9.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 (118) hide show
  1. package/README.md +32 -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 +69 -2
  27. package/dist/cli-agents.d.ts.map +1 -1
  28. package/dist/cli-agents.js +358 -394
  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,36 @@ 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. The orchestrator automatically rotates through the frontier chain when the current tier is unavailable:
262
+
263
+ 1. `gemini-3.1-pro-preview` (newest frontier, preview-tier access)
264
+ 2. `gemini-3-pro-preview` (previous frontier, preview-tier access)
265
+ 3. `gemini-2.5-pro` (stable last-gen frontier, universally available)
266
+
267
+ **Rotation fires on both capacity and access failures.** Users without preview-tier access (most accounts) will see the chain naturally fall through to `gemini-2.5-pro` on the first call — which is still a frontier-class model, far better than the Auto router's `gemini-2.5-flash-lite` downselect. Users *with* preview access get the newest model when capacity is available, with graceful fallback when it isn't.
268
+
269
+ Rotatable failure patterns:
270
+ - Capacity: `429`, `"No capacity available"`, `quota`, `rate limit`, `too many requests`
271
+ - Access: `ModelNotFoundError`, `"Requested entity was not found"`, `403`, `permission denied`
272
+
273
+ Rotation aborts immediately on unrelated failures (auth, subprocess crash, prompt rejection) — a different model won't fix those.
274
+
275
+ Overrides:
276
+ - Per-call: `roast(..., models={gemini: "gemini-2.5-flash"})` — caller chooses, no rotation.
277
+ - Per-environment: `BRUTALIST_GEMINI_MODEL=gemini-2.5-pro` — operator chooses, no rotation. Set this to `gemini-2.5-pro` to skip the preview-tier probe cost if you know your account lacks access.
278
+
247
279
  ## Why Multiple Perspectives
248
280
 
249
281
  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"}