Hermes
c9015b59ad
[pending-judge] feat(DC-162 rev2): "Connect your AI" — spec Streamable HTTP MCP + one-click keys
Judge r1 (grade D) blockers, each fixed and tested:
1. TRANSPORT: custom POST-only JSON-RPC → MCP 2025-03-10 Streamable HTTP
(spec-canonical; replaced HTTP+SSE). POST answers application/json for
requests; valid notifications -> 202 empty; malformed notifications ->
no reply (204); batching removed in this revision -> arrays rejected
-32600. GET (server->client stream) and DELETE (session termination)
answer 405 + Allow: POST — the spec's explicit allowance for stateless
request/response servers; documented in /info + modal + OpenAPI.
Origin header validated when present (DNS-rebinding MUST); Accept
negotiation (json required, else 406); MCP-Protocol-Version header
checked when sent. Clients needing server-initiated streams use the
stdio bridge (unchanged, shares mcp-core).
2. CREDENTIAL TYPE PRESERVATION: routes/mcp.js now forwards the SAME
scheme the caller authenticated with (req.auth.type from
middleware.js:549-586): apikey -> x-api-key, jwt -> Authorization
Bearer (NOT dk_-coerced-x-api-key as r1 did). mcp-core createToolHandler
accepts explicit headers. Tests assert BOTH shapes downstream
(apikey carries x-api-key & no Authorization; jwt carries Bearer & no
x-api-key; zero downstream calls for session denial).
3. JSON-RPC VALIDATION: validateJsonRpc — jsonrpc:'2.0', non-empty string
method, params object-or-omitted, id string|number|null. Invalid
Request -32600 (empty body, empty array, batch); tools/call without
string params.name -> -32602; unknown method -> -32601; error envelopes
carry id null when unpairable. Transport primitives rejected by the
app-wide strict JSON parser (400; asserted).
4. REPRODUCIBILITY: status/dist/features.js + sw.js regenerated and
committed IN THE PATCH (repo convention: DC-130/131 committed bundle
rebuilds). Verifier greps the built bundle for aiconn- (23),
mcp/connections (1), httpConfig (2) so a clean `git am` checkout serves
the real frontend.
Judge r1 polish, all applied:
- verifier accepts 0_PATCH.diff / PATCH.diff naming (indexed artifact);
- connections list filtered server-side to "AI connection (...)" keys
(new GET /mcp/connections, session-only; modal switched to it);
- URL-encoded tool path params (serviceId, containerId, action,
templateId, category, zone) in mcp-core.
Config shape: POST /mcp/config (session-only; apikey 403) returns the
standard Streamable-HTTP card {url, transport: streamable-http, headers:
{x-api-key}, mcpProtocolVersion} + per-client note (ChatGPT note states
the public-https requirement honestly; no fabricated connector claims).
Tests: 57 green (34 route incl. auth matrix/type-preservation/transport
rules/JSON-RPC errors + 23 core). Composition-root e2e (8) boots the real
createApp with the mount. eslint 0 errors. Full suite: only the
pre-existing pdf-parse billing family red (unchanged since base 470dfaa).
2026-10-08 03:46:56 -07:00
..
2026-10-07 20:44:07 -07:00
2026-08-22 19:42:25 -07:00
2026-09-13 05:32:13 -07:00
2026-08-08 15:39:48 -07:00
2026-08-22 19:42:25 -07:00
2026-08-13 03:38:46 -07:00
2026-08-17 18:19:41 -07:00
2026-06-13 12:16:56 -07:00
2026-08-18 03:32:54 -07:00
2026-08-04 14:18:49 -07:00
2026-06-25 16:43:10 -07:00
2026-10-03 21:43:11 -07:00
2026-08-18 15:10:36 -07:00
2026-08-31 23:37:00 -07:00
2026-10-07 20:59:17 -07:00
2026-10-07 00:58:03 -07:00
2026-06-13 12:16:56 -07:00
2026-08-16 04:18:07 -07:00
2026-06-10 21:37:55 -07:00
2026-08-12 06:20:48 -07:00
2026-10-07 08:31:14 -07:00
2026-08-18 17:52:49 -07:00
2026-08-18 11:31:47 -07:00
2026-08-12 12:27:57 -07:00
2026-08-17 16:04:18 -07:00
2026-08-18 05:09:15 -07:00
2026-08-16 04:18:07 -07:00
2026-06-13 12:16:56 -07:00
2026-08-17 20:53:13 -07:00
2026-06-25 16:43:10 -07:00
2026-08-18 14:53:57 -07:00
2026-08-18 13:16:44 -07:00
2026-08-12 04:59:03 -07:00
2026-08-15 00:01:17 -07:00
2026-08-22 18:15:37 -07:00
2026-08-18 18:56:13 -07:00
2026-08-31 23:37:00 -07:00
2026-10-08 03:46:56 -07:00
2026-06-25 16:43:10 -07:00
2026-10-03 21:12:35 -07:00
2026-10-03 23:25:23 -07:00
2026-10-03 21:37:13 -07:00
2026-10-03 21:31:57 -07:00
2026-10-03 21:29:41 -07:00
2026-10-03 21:14:20 -07:00
2026-10-03 21:37:13 -07:00
2026-10-03 21:40:09 -07:00
2026-10-03 21:47:34 -07:00
2026-08-22 19:42:25 -07:00
2026-08-31 23:37:00 -07:00
2026-08-23 17:26:07 -07:00
2026-08-22 05:41:38 -07:00
2026-08-19 00:10:37 -07:00
2026-10-07 00:58:03 -07:00
2026-08-18 15:31:07 -07:00
2026-06-10 21:37:55 -07:00
2026-08-18 18:32:34 -07:00
2026-08-12 06:20:48 -07:00
2026-08-16 04:18:07 -07:00
2026-06-25 16:43:10 -07:00
2026-08-15 00:01:16 -07:00
2026-08-12 12:50:39 -07:00
2026-08-12 06:20:48 -07:00