crosscheck-mcp 0.1.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.
package/LICENSE ADDED
@@ -0,0 +1,145 @@
1
+ Copyright (c) 2026 Frank Speiser. All rights reserved.
2
+
3
+ This software is licensed under the PolyForm Noncommercial License 1.0.0.
4
+ The full license text follows. The authoritative source is:
5
+
6
+ https://polyformproject.org/licenses/noncommercial/1.0.0
7
+
8
+ Commercial use of this software is NOT permitted under this license. For
9
+ commercial licensing inquiries, contact the copyright holder
10
+ (frank@metafide.io). Pre-existing commercial license grants (if any)
11
+ are recorded in COMMERCIAL-LICENSES.md.
12
+
13
+ ================================================================================
14
+
15
+ PolyForm Noncommercial License 1.0.0
16
+
17
+ <https://polyformproject.org/licenses/noncommercial/1.0.0>
18
+
19
+ ## Acceptance
20
+
21
+ In order to get any license under these terms, you must agree
22
+ to them as both strict obligations and conditions to all
23
+ your licenses.
24
+
25
+ ## Copyright License
26
+
27
+ The licensor grants you a copyright license for the
28
+ software to do everything you might do with the software
29
+ that would otherwise infringe the licensor's copyright
30
+ in it for any permitted purpose. However, you may
31
+ only distribute the software according to [Distribution
32
+ License](#distribution-license) and make changes or new works
33
+ based on the software according to [Changes and New Works
34
+ License](#changes-and-new-works-license).
35
+
36
+ ## Distribution License
37
+
38
+ The licensor grants you an additional copyright license
39
+ to distribute copies of the software. Your license
40
+ to distribute covers distributing the software with
41
+ any changes or new works or licenses or to third parties
42
+ according to [Notices](#notices).
43
+
44
+ ## Changes and New Works License
45
+
46
+ The licensor grants you an additional copyright license to
47
+ make changes and new works based on the software for any
48
+ permitted purpose.
49
+
50
+ ## Patent License
51
+
52
+ The licensor grants you a patent license for the software that
53
+ covers patent claims the licensor can license, or becomes able
54
+ to license, that you would infringe by using the software.
55
+
56
+ ## Noncommercial Purposes
57
+
58
+ Any noncommercial purpose is a permitted purpose.
59
+
60
+ ## Personal Uses
61
+
62
+ Personal use for research, experiment, and testing for
63
+ the benefit of public knowledge, personal study, private
64
+ entertainment, hobby projects, amateur pursuits, or religious
65
+ observance, without any anticipated commercial application,
66
+ is use for a permitted purpose.
67
+
68
+ ## Noncommercial Organizations
69
+
70
+ Use by any charitable organization, educational institution,
71
+ public research organization, public safety or health
72
+ organization, environmental protection organization,
73
+ or government institution is use for a permitted purpose
74
+ regardless of the source of funding or obligations resulting
75
+ from the funding.
76
+
77
+ ## Fair Use
78
+
79
+ You may have "fair use" rights for the software under the
80
+ law. These terms do not limit them.
81
+
82
+ ## No Other Rights
83
+
84
+ These terms do not allow you to sublicense or transfer any of
85
+ your licenses to anyone else, or prevent the licensor from
86
+ granting licenses to anyone else, or make any other licenses
87
+ to the software.
88
+
89
+ ## Patent Defense
90
+
91
+ If you make any written claim that the software infringes or
92
+ contributes to infringement of any patent, your patent license
93
+ for the software granted under these terms ends immediately. If
94
+ your company makes such a claim, your patent license ends
95
+ immediately for work on behalf of your company.
96
+
97
+ ## Violations
98
+
99
+ The first time you are notified in writing that you have
100
+ violated any of these terms, or done anything with the software
101
+ not covered by your licenses, your licenses can nonetheless
102
+ continue if you come into full compliance with these terms,
103
+ and take practical steps to correct past violations, within
104
+ 32 days of receiving notice. Otherwise, all your licenses
105
+ end immediately.
106
+
107
+ ## No Liability
108
+
109
+ ***As far as the law allows, the software comes as is, without
110
+ any warranty or condition, and the licensor will not be liable
111
+ to you for any damages arising out of these terms or the use
112
+ or nature of the software, under any kind of legal claim.***
113
+
114
+ ## Definitions
115
+
116
+ The **licensor** is the individual or entity offering these
117
+ terms, and the **software** is the software the licensor makes
118
+ available under these terms.
119
+
120
+ **You** refers to the individual or entity agreeing to these
121
+ terms.
122
+
123
+ **Your company** is any legal entity, sole proprietorship,
124
+ or other kind of organization that you work for, plus all
125
+ organizations that have control over, are under the control
126
+ of, or are under common control with that organization.
127
+ **Control** means ownership of substantially all the assets of
128
+ an entity, or the power to direct its management and policies
129
+ by vote, contract, or otherwise. Control can be direct or
130
+ indirect.
131
+
132
+ **Your licenses** are all the licenses granted to you for the
133
+ software under these terms.
134
+
135
+ **Use** means anything you do with the software requiring one
136
+ of your licenses.
137
+
138
+ ================================================================================
139
+
140
+ NOTE ON PRIOR LICENSE
141
+
142
+ This software was previously released under the MIT License. The MIT
143
+ grant on those historical snapshots remains in effect for anyone who
144
+ obtained the software while it was MIT-licensed; this PolyForm
145
+ Noncommercial License governs all subsequent commits and releases.
package/README.md ADDED
@@ -0,0 +1,272 @@
1
+ # crosscheck-mcp
2
+
3
+ A multi-LLM MCP server. Ask several models the same question, debate them,
4
+ orchestrate them, audit them, or rubric-grade their work — all from a single
5
+ MCP tool surface that drops into Claude Desktop / Claude Code / Cursor /
6
+ Continue / any other MCP host.
7
+
8
+ This is the **TypeScript** implementation. There is also a Python implementation
9
+ in [`../python/`](../python/) — both ship the same tool surface; pick whichever
10
+ fits your stack. The TypeScript build runs natively in Node 18.17+ and has
11
+ **no Python dependency at runtime**.
12
+
13
+ ## What it does
14
+
15
+ Twenty-six tools across deliberation, planning, auditing, and operations.
16
+ Highlights:
17
+
18
+ - `confer` / `debate` / `coordinate` / `triangulate` — parallel panel calls,
19
+ structured deliberation, structured synthesis with dissent
20
+ - `audit` — rubric-graded scoring; single-judge or multi-judge consensus
21
+ (median + std-dev disagreement detection, severity-aware obvious-failure flags)
22
+ - `orchestrate` — planner-driven DAG of LLM subtasks with optional cheap-mode
23
+ tier-aware routing
24
+ - `create` / `create_cheap` — lifecycle macros: scope → build → review →
25
+ audit, with retry-on-failure
26
+ - `solve` — iterative propose → verify → retry with sandboxed shell verifiers
27
+ - `verify` — deterministic property checks (text, shell, url_head)
28
+ - `recall` / `session_memory` / `scoreboard` / `explain` — operational
29
+ introspection
30
+
31
+ Cross-cutting features: scoreboard-driven router for panel selection,
32
+ session circuit breakers (cost / tokens / wall / DAG breadth), cross-provider
33
+ canary detection for indirect prompt-injection, early-stop on agreement,
34
+ prompt canonicalisation cache, structured claims with supports/attacks edges.
35
+
36
+ ## Install
37
+
38
+ ```bash
39
+ npm install -g crosscheck-mcp
40
+ ```
41
+
42
+ This installs the `crosscheck-mcp` binary on your PATH.
43
+
44
+ The package needs at least one LLM provider API key in the environment.
45
+ Supported providers (set any subset):
46
+
47
+ ```bash
48
+ export ANTHROPIC_API_KEY=...
49
+ export OPENAI_API_KEY=...
50
+ export XAI_API_KEY=...
51
+ export GEMINI_API_KEY=...
52
+ export MISTRAL_API_KEY=...
53
+ export GROQ_API_KEY=...
54
+ export DEEPSEEK_API_KEY=...
55
+ ```
56
+
57
+ ## Use it with an MCP host
58
+
59
+ ### Claude Code
60
+
61
+ Add the server to your project's `.claude/settings.json` (or the user-level
62
+ config):
63
+
64
+ ```json
65
+ {
66
+ "mcpServers": {
67
+ "crosscheck": {
68
+ "command": "crosscheck-mcp",
69
+ "env": {
70
+ "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
71
+ "OPENAI_API_KEY": "${OPENAI_API_KEY}"
72
+ }
73
+ }
74
+ }
75
+ }
76
+ ```
77
+
78
+ Restart Claude Code; the `mcp__crosscheck__*` tools become available.
79
+
80
+ Tip — type `xc` or `XC` at the start of a prompt to route it to crosscheck;
81
+ the server ships an MCP `instructions` payload that teaches Claude Code the
82
+ convention. Details in [`../../CROSSCHECK_USAGE.md`](../../CROSSCHECK_USAGE.md).
83
+
84
+ ### Claude Desktop
85
+
86
+ Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
87
+ or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
88
+
89
+ ```json
90
+ {
91
+ "mcpServers": {
92
+ "crosscheck": {
93
+ "command": "crosscheck-mcp",
94
+ "env": {
95
+ "ANTHROPIC_API_KEY": "sk-ant-...",
96
+ "OPENAI_API_KEY": "sk-..."
97
+ }
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ Restart Claude Desktop. Tools appear under the hammer icon.
104
+
105
+ ### Cursor
106
+
107
+ Cursor reads MCP servers from `~/.cursor/mcp.json`. Same shape:
108
+
109
+ ```json
110
+ {
111
+ "mcpServers": {
112
+ "crosscheck": {
113
+ "command": "crosscheck-mcp",
114
+ "env": {
115
+ "ANTHROPIC_API_KEY": "sk-ant-...",
116
+ "OPENAI_API_KEY": "sk-..."
117
+ }
118
+ }
119
+ }
120
+ }
121
+ ```
122
+
123
+ ### Any other MCP host
124
+
125
+ Spawn `crosscheck-mcp` over stdio. It speaks MCP JSON-RPC 2.0 — no custom
126
+ protocol.
127
+
128
+ ## Optional configuration
129
+
130
+ Environment variables:
131
+
132
+ | Variable | Purpose |
133
+ |-----------------------------------|-----------------------------------------------------------------------------------------------|
134
+ | `CROSSCHECK_DB_PATH` | SQLite path for scoreboard / claims / session memory / recall. Default: `.crosscheck/db.sqlite` |
135
+ | `CROSSCHECK_DB_DISABLED=1` | Skip storage entirely (storage-driven tools return graceful errors). |
136
+ | `CROSSCHECK_TRANSCRIPTS_DIR` | Where audit's session-id-only mode looks for transcripts. |
137
+ | `CROSSCHECK_PRICING_PATH` | Path to `pricing.json` (used by cheap-mode tier picker). |
138
+ | `CROSSCHECK_REPO_ROOT` | Override repo-root detection (used by `fetch` for evidence paths). |
139
+ | `CROSSCHECK_REJECT_CONFIG_DRIFT=1`| Reject pinned-config drift instead of warning. |
140
+ | `CROSSCHECK_BRIDGE_PYTHON=1` | OPT-IN: spawn the Python server as a parity-testing backstop (see below). |
141
+ | `CROSSCHECK_EVENTS` | Structured event emitter: `stderr` (default), `off`, `file`, `both`. See [Observability](#observability). |
142
+ | `CROSSCHECK_EVENTS_PATH` | Path for the `file` / `both` event sinks (ND-JSON, one event per line). |
143
+ | `<PROVIDER>_API_KEY` | At least one is required for LLM-using tools. Optional for `verify`-only flows. |
144
+ | `<PROVIDER>_MODEL` | Override a provider's default model. |
145
+
146
+ The Python backstop is OPTIONAL. **Every v1 feature path on every
147
+ tool runs natively in TypeScript.** The bridge is useful for:
148
+ 1. Cross-language parity testing (the `test/parity/` fixtures check
149
+ that the TS implementation produces byte-equal output against
150
+ the Python oracle).
151
+ 2. The `reactive` opt on `orchestrate` (mid-flight DAG mutation),
152
+ which still defers to bridge.
153
+ 3. A few remaining advanced opts that no longer have a Node-side
154
+ implementation but kept the bridge as a fallback when host
155
+ integrations aren't wired (e.g. `worker_tools` without
156
+ `innerCallers`).
157
+
158
+ Everything in the [Tools](#what-it-does) list above works without
159
+ \`CROSSCHECK_BRIDGE_PYTHON\` being set.
160
+
161
+ ## Observability
162
+
163
+ Every `tools/call` request emits one structured `tool_invoke` event
164
+ through a pluggable event bus. The default sink is ND-JSON to
165
+ stderr — MCP hosts already capture stderr into their session logs,
166
+ so this lights up out of the box with no configuration.
167
+
168
+ ### Event shape
169
+
170
+ ```json
171
+ {
172
+ "event": "tool_invoke",
173
+ "id": "1a3c0f5d",
174
+ "tool": "confer",
175
+ "started_at": "2026-06-06T19:42:11.231Z",
176
+ "duration_ms": 1842,
177
+ "status": "ok",
178
+ "args_keys": ["question", "providers", "untrusted_input"],
179
+ "result_keys": ["answers", "question", "tool"],
180
+ "envelope_bytes": 12451
181
+ }
182
+ ```
183
+
184
+ Failure paths emit the same shape with `status: "error"` and an
185
+ `error_message` (truncated to 512 chars). When a tool returns a
186
+ domain-level error envelope (with `error_code`), the call still
187
+ completes — `status` stays `"ok"` and `error_code` is mirrored to
188
+ the event for easy filtering:
189
+
190
+ ```json
191
+ {
192
+ "event": "tool_invoke", "id": "...", "tool": "audit",
193
+ "status": "ok",
194
+ "error_code": "AUDIT_NO_AUDITOR",
195
+ "...": "..."
196
+ }
197
+ ```
198
+
199
+ What's deliberately **not** in the event: argument values, response
200
+ text, transcripts. Long prompts + multi-LLM debates would dwarf the
201
+ signal and may carry sensitive content. Key inventory + envelope
202
+ size is usually enough to triage a regression; pull the full
203
+ envelope from a tool replay when you need it.
204
+
205
+ ### Routing
206
+
207
+ | `CROSSCHECK_EVENTS=` | Effect |
208
+ |----------------------|---------------------------------------------------------|
209
+ | `stderr` (default) | ND-JSON to stderr. |
210
+ | `off` | Silent. Useful for noisy multi-tool benchmark runs. |
211
+ | `file` | Append to `CROSSCHECK_EVENTS_PATH` only. |
212
+ | `both` | Append to file AND write to stderr. |
213
+
214
+ `CROSSCHECK_EVENTS_PATH` is required when `CROSSCHECK_EVENTS` is
215
+ `file` or `both`. Parent directories are created on first emit.
216
+
217
+ ### Custom emitters (programmatic)
218
+
219
+ ```ts
220
+ import { setEventEmitter } from "crosscheck-mcp";
221
+
222
+ setEventEmitter({
223
+ emit(event) {
224
+ metrics.histogram("crosscheck.tool_duration_ms",
225
+ event.duration_ms, { tool: event.tool, status: event.status });
226
+ },
227
+ });
228
+ ```
229
+
230
+ The emitter is replaced for the whole process; for test isolation
231
+ use the `RecordingEmitter` export and restore the original via
232
+ `getEventEmitter()` / `setEventEmitter()` in `beforeEach` /
233
+ `afterEach`.
234
+
235
+ ## Programmatic use
236
+
237
+ ```ts
238
+ import { createServer, connectAndServe } from "crosscheck-mcp";
239
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
240
+
241
+ const server = createServer({ /* providers, storage, pricing, repoRoot ... */ });
242
+ await server.connect(new StdioServerTransport());
243
+ ```
244
+
245
+ ## Development
246
+
247
+ ```bash
248
+ git clone https://github.com/fxspeiser/crosscheck-agent
249
+ cd crosscheck-agent/servers/typescript
250
+ npm install
251
+ npm run build # tsup → dist/{node-stdio,node-http,browser-ext}.{js,cjs}
252
+ npm test # vitest — 1,175 tests
253
+ npm run typecheck # tsc --noEmit
254
+ npm run docs:usage # regenerate the routing-convention doc from src/instructions.ts
255
+ ```
256
+
257
+ End-to-end stdio handshake:
258
+
259
+ ```bash
260
+ printf '%s\n' \
261
+ '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"x","version":"0"}}}' \
262
+ '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
263
+ '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
264
+ '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"ping","arguments":{"echo":"hello"}}}' \
265
+ | node dist/node-stdio.js
266
+ ```
267
+
268
+ ## License
269
+
270
+ [PolyForm Noncommercial 1.0.0](LICENSE). Commercial licenses are tracked in
271
+ [../../COMMERCIAL-LICENSES.md](../../COMMERCIAL-LICENSES.md); contact
272
+ `frank@metafide.io` for inquiries.
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/entrypoints/browser-ext.ts
22
+ var browser_ext_exports = {};
23
+ __export(browser_ext_exports, {
24
+ PLACEHOLDER: () => PLACEHOLDER
25
+ });
26
+ module.exports = __toCommonJS(browser_ext_exports);
27
+ var PLACEHOLDER = "browser-ext transport \u2014 not yet implemented";
28
+ // Annotate the CommonJS export names for ESM import in node:
29
+ 0 && (module.exports = {
30
+ PLACEHOLDER
31
+ });
32
+ //# sourceMappingURL=browser-ext.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/entrypoints/browser-ext.ts"],"sourcesContent":["// Browser-extension entrypoint — stub. Will host the\n// chrome.runtime.onMessage transport adapter (added in a later phase).\n// Tsup builds a bundle slot for it from day one so the dist/ surface\n// is stable.\n\nexport const PLACEHOLDER = \"browser-ext transport — not yet implemented\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,IAAM,cAAc;","names":[]}
@@ -0,0 +1,3 @@
1
+ declare const PLACEHOLDER = "browser-ext transport \u2014 not yet implemented";
2
+
3
+ export { PLACEHOLDER };
@@ -0,0 +1,3 @@
1
+ declare const PLACEHOLDER = "browser-ext transport \u2014 not yet implemented";
2
+
3
+ export { PLACEHOLDER };
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/entrypoints/browser-ext.ts
4
+ var PLACEHOLDER = "browser-ext transport \u2014 not yet implemented";
5
+ export {
6
+ PLACEHOLDER
7
+ };
8
+ //# sourceMappingURL=browser-ext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/entrypoints/browser-ext.ts"],"sourcesContent":["// Browser-extension entrypoint — stub. Will host the\n// chrome.runtime.onMessage transport adapter (added in a later phase).\n// Tsup builds a bundle slot for it from day one so the dist/ surface\n// is stable.\n\nexport const PLACEHOLDER = \"browser-ext transport — not yet implemented\";\n"],"mappings":";;;AAKO,IAAM,cAAc;","names":[]}
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/entrypoints/node-http.ts
22
+ var node_http_exports = {};
23
+ __export(node_http_exports, {
24
+ PLACEHOLDER: () => PLACEHOLDER
25
+ });
26
+ module.exports = __toCommonJS(node_http_exports);
27
+
28
+ // node_modules/tsup/assets/cjs_shims.js
29
+ var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
30
+ var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
31
+
32
+ // src/entrypoints/node-http.ts
33
+ var PLACEHOLDER = "node-http transport \u2014 not yet implemented";
34
+ if (importMetaUrl === `file://${process.argv[1]}`) {
35
+ process.stderr.write(
36
+ "crosscheck-agent: node-http entrypoint is not yet implemented (Phase 0).\n"
37
+ );
38
+ process.exit(2);
39
+ }
40
+ // Annotate the CommonJS export names for ESM import in node:
41
+ 0 && (module.exports = {
42
+ PLACEHOLDER
43
+ });
44
+ //# sourceMappingURL=node-http.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/entrypoints/node-http.ts","../node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["// Node-HTTP entrypoint — stub. Will host the MCP Streamable HTTP transport\n// (added in a later phase). Lives here so tsup builds a bundle slot for it\n// from day one, and so the import surface in `dist/` is stable.\n\nexport const PLACEHOLDER = \"node-http transport — not yet implemented\";\n\nif (import.meta.url === `file://${process.argv[1]}`) {\n process.stderr.write(\n \"crosscheck-agent: node-http entrypoint is not yet implemented (Phase 0).\\n\",\n );\n process.exit(2);\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,QAAQ,YAAY,MAAM,WAC1E,SAAS,cAAc,MACvB,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEtC,IAAM,gBAAgC,iCAAiB;;;ADRvD,IAAM,cAAc;AAE3B,IAAI,kBAAoB,UAAU,QAAQ,KAAK,CAAC,CAAC,IAAI;AACnD,UAAQ,OAAO;AAAA,IACb;AAAA,EACF;AACA,UAAQ,KAAK,CAAC;AAChB;","names":[]}
@@ -0,0 +1,3 @@
1
+ declare const PLACEHOLDER = "node-http transport \u2014 not yet implemented";
2
+
3
+ export { PLACEHOLDER };
@@ -0,0 +1,3 @@
1
+ declare const PLACEHOLDER = "node-http transport \u2014 not yet implemented";
2
+
3
+ export { PLACEHOLDER };
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/entrypoints/node-http.ts
4
+ var PLACEHOLDER = "node-http transport \u2014 not yet implemented";
5
+ if (import.meta.url === `file://${process.argv[1]}`) {
6
+ process.stderr.write(
7
+ "crosscheck-agent: node-http entrypoint is not yet implemented (Phase 0).\n"
8
+ );
9
+ process.exit(2);
10
+ }
11
+ export {
12
+ PLACEHOLDER
13
+ };
14
+ //# sourceMappingURL=node-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/entrypoints/node-http.ts"],"sourcesContent":["// Node-HTTP entrypoint — stub. Will host the MCP Streamable HTTP transport\n// (added in a later phase). Lives here so tsup builds a bundle slot for it\n// from day one, and so the import surface in `dist/` is stable.\n\nexport const PLACEHOLDER = \"node-http transport — not yet implemented\";\n\nif (import.meta.url === `file://${process.argv[1]}`) {\n process.stderr.write(\n \"crosscheck-agent: node-http entrypoint is not yet implemented (Phase 0).\\n\",\n );\n process.exit(2);\n}\n"],"mappings":";;;AAIO,IAAM,cAAc;AAE3B,IAAI,YAAY,QAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC,IAAI;AACnD,UAAQ,OAAO;AAAA,IACb;AAAA,EACF;AACA,UAAQ,KAAK,CAAC;AAChB;","names":[]}