@oomkapwn/enquire-mcp 3.8.5 → 3.8.7
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/CHANGELOG.md +127 -0
- package/README.md +4 -4
- package/dist/http-transport.d.ts +91 -1
- package/dist/http-transport.d.ts.map +1 -1
- package/dist/http-transport.js +234 -27
- package/dist/http-transport.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/docs/COMPARISON.md +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,133 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
4
|
|
|
5
|
+
## [3.8.7] — 2026-05-25
|
|
6
|
+
|
|
7
|
+
> **TL;DR:** **HTTP transport hardening — P2-10 stateful session races (3 conditions) + P2-11 close cleanup gap (registry leak).** `src/http-transport.ts` now uses an in-flight refcount on each `StatefulSession` so the idle sweep skips busy sessions instead of force-closing them mid-stream; the max-sessions cap-check includes a `pendingInits` counter so concurrent initialize POSTs can't TOCTOU past the limit; DELETE marks `closing=true` and removes from the registry BEFORE the protocol-level shutdown runs (concurrent fetchers 404 instead of joining a half-closed session). New `shutdownHttpServer(server)` helper drains the registry + closes the TCP listener + closes vault/fts/watcher/embed-db handles — the production signal handlers + tests both use it now. **+10 negative-control tests; 888 unit tests; no API breaks.**
|
|
8
|
+
|
|
9
|
+
**Patch — HTTP transport correctness.**
|
|
10
|
+
|
|
11
|
+
### Why this matters
|
|
12
|
+
|
|
13
|
+
The v2.14.0 stateful-mode HTTP transport had three latent race conditions and one cleanup gap that were deferred from the v3.7.16 round-18 audit:
|
|
14
|
+
|
|
15
|
+
- **P2-10 race 1 (cap-check TOCTOU)**: `if (registry.size() >= maxSessions) reject` happens BEFORE the async server+transport allocation. N concurrent initialize POSTs all see `size() < maxSessions`, all proceed to allocate, all `onsessioninitialized` callbacks register — overshooting the cap. With `maxSessions: 100`, an adversary holding a valid bearer token could spawn 200+ sessions before the registry catches up.
|
|
16
|
+
- **P2-10 race 2 (sweep vs in-flight)**: The idle sweep checks `lastActivityMs < cutoff` and immediately calls `transport.close()` + `server.close()`. For a long-running SSE GET stream that touched `lastActivityMs` once at the start, the sweep eventually fires (after `idleTimeoutMs`) and closes the transport mid-stream — the response stream goes inconsistent, the SDK's internal queue trips, the client sees a broken connection.
|
|
17
|
+
- **P2-10 race 3 (DELETE vs concurrent use)**: DELETE fetches the session, calls `await session.transport.handleRequest(req, res)` for protocol shutdown, then closes. A concurrent POST/GET that arrives during the DELETE's `handleRequest` await can `registry.sessions.get(sessionId)` successfully, increment `lastActivityMs`, and start its own `handleRequest` on a transport that's about to be torn down.
|
|
18
|
+
- **P2-11 (registry leak on close)**: `httpServer.close()` stops accepting new connections but doesn't iterate the stateful-mode registry — every active session leaks its McpServer + StreamableHTTPServerTransport pair, plus the per-session SQLite handles those entrain. Tests passing `installSignalHandlers: false` had no clean way to drain.
|
|
19
|
+
|
|
20
|
+
### Fixes
|
|
21
|
+
|
|
22
|
+
`src/http-transport.ts` — `StatefulSession` interface + `SessionRegistry` interface + handler:
|
|
23
|
+
|
|
24
|
+
- **In-flight refcount.** New `inFlight: number` + `closing: boolean` fields on every `StatefulSession`. A `runWithRefcount(session, fn)` helper wraps every `handleRequest` call: increment synchronously, decrement in `finally`. Sweep now skips sessions with `inFlight > 0` (they're not idle, they're busy) and sessions with `closing=true` (already being torn down).
|
|
25
|
+
- **`pendingInits` counter.** Cap-check is now `size + pendingInits >= maxSessions`. Each initialize handler increments before `buildMcpServer`/`new StreamableHTTPServerTransport` and decrements in a `finally`. Concurrent inits no longer TOCTOU past the limit. New `tests/http-transport.test.ts` test fires 6 concurrent inits at `maxSessions: 2` and asserts ≤2 succeed.
|
|
26
|
+
- **DELETE marks-then-deletes.** Before the SDK's protocol-level `handleRequest`, the handler sets `session.closing = true` + `registry.sessions.delete(sessionId)` synchronously. Concurrent fetchers find no entry → 404. The DELETE itself uses `runWithRefcount` so the close phase waits for its own + any pre-existing in-flight to drain (bounded 5s) before `transport.close()` + `server.close()`.
|
|
27
|
+
- **`SessionRegistry.closeAll(timeoutMs?)`.** Snapshots all sessions, marks them `closing`, clears the map, waits up to `timeoutMs` (default 5s) for `inFlight` to reach 0, then `await`s `transport.close()` + `server.close()` on each. Idempotent.
|
|
28
|
+
- **`shutdownHttpServer(server)` helper.** Tracks the registry + `ServerDeps` via a module-private `WeakMap<HttpServer, HttpServerExtras>` set inside `startHttpServer`. Drains registry → `httpServer.close()` → flushes persistent cache → closes ftsIndex/watcher/watcherEmbedDb. Both the SIGINT/SIGTERM handlers and tests now call this; idempotent on second call.
|
|
29
|
+
|
|
30
|
+
### Tests added
|
|
31
|
+
|
|
32
|
+
`tests/http-transport.test.ts` — 10 new tests, mix of unit + integration, all with explicit POSITIVE + NEGATIVE controls per the CLAUDE.md rule since v3.6.4:
|
|
33
|
+
|
|
34
|
+
- **SessionRegistry unit (7 tests)**:
|
|
35
|
+
- `sweepIdle skips in-flight sessions even if lastActivityMs is past cutoff` (POSITIVE)
|
|
36
|
+
- `(NEGATIVE control) — without inFlight tracking, sweep would evict busy entries` (validates the test would catch a regression)
|
|
37
|
+
- `sweepIdle skips already-closing sessions` (idempotency under closeAll)
|
|
38
|
+
- `closeAll drains all sessions + invokes transport.close + server.close` (counter-tracking stubs)
|
|
39
|
+
- `closeAll waits for in-flight to drain (bounded by timeoutMs)` (simulated slow handler)
|
|
40
|
+
- `pendingInits starts at 0` (initial-state guard)
|
|
41
|
+
- **End-to-end (3 tests)**:
|
|
42
|
+
- `shutdownHttpServer drains stateful sessions + closes the TCP listener` (verifies subsequent fetch fails)
|
|
43
|
+
- `shutdownHttpServer works on stateless servers (no registry to drain)`
|
|
44
|
+
- `shutdownHttpServer is idempotent — second call is a safe no-op`
|
|
45
|
+
- `concurrent initialize POSTs cannot exceed maxSessions (TOCTOU defense)` — fires 6 parallel inits at cap=2, asserts ≤2 success + remainder 503
|
|
46
|
+
|
|
47
|
+
### Behavior changes (none breaking)
|
|
48
|
+
|
|
49
|
+
- No public-API breaks. `createSessionRegistry` now returns an object with two new members (`pendingInits` field + `closeAll` method) but the existing surface is unchanged.
|
|
50
|
+
- `createHttpHandler` gained an OPTIONAL third parameter `out?: { registry: SessionRegistry | null }`. Backwards-compatible (omit = unaffected).
|
|
51
|
+
- `shutdownHttpServer(server)` is the new recommended way to close servers from `startHttpServer`. Direct `server.close()` still works but doesn't drain the registry.
|
|
52
|
+
|
|
53
|
+
### Files changed
|
|
54
|
+
|
|
55
|
+
- `src/http-transport.ts` — refcount + pendingInits + closeAll + shutdownHttpServer (+150 lines)
|
|
56
|
+
- `tests/http-transport.test.ts` — 10 new tests (~180 lines)
|
|
57
|
+
- `README.md`, `llms.txt`, `AGENTS.md`, `docs/COMPARISON.md`, `package.json` — test-count claims 878 → 888
|
|
58
|
+
- version bump 3.8.6 → 3.8.7 (7 surfaces)
|
|
59
|
+
|
|
60
|
+
### What's next
|
|
61
|
+
|
|
62
|
+
Continuing the no-deferrals run:
|
|
63
|
+
- **v3.8.8** — META structural-defense scope completeness audit (the recurring recursion-pair class — pattern "every claim of 'closes the recursion' is wrong" has 6 documented instances; structural-defense scope completeness audit may be the only real fix).
|
|
64
|
+
- **v3.9.0-rc.1** — OCR'd PDF watcher embed-sync + HNSW in-memory live update (architectural minor bump).
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## [3.8.6] — 2026-05-25
|
|
69
|
+
|
|
70
|
+
> **TL;DR:** **Tier C discoverability completion — Schema.org JSON-LD injection on GH Pages.** Adds `scripts/inject-jsonld.mjs` that runs after `npm run docs:api` in `publish-docs.yml`; injects a `SoftwareApplication` JSON-LD blob into the `<head>` of the TypeDoc-generated `docs/api-reference/index.html`. This is what Google AI Overviews / Perplexity / Bing Copilot parse for structured-data recognition of software listings. Idempotent (skips if marker present). FUNDING.yml already present from prior config. **No code changes; 878 tests unchanged.**
|
|
71
|
+
|
|
72
|
+
**Patch — Tier C discoverability completion.**
|
|
73
|
+
|
|
74
|
+
### What JSON-LD does for discoverability
|
|
75
|
+
|
|
76
|
+
Schema.org JSON-LD in `<head>` is the canonical structured-data format consumed by:
|
|
77
|
+
- **Google AI Overviews** (Gemini-powered search) — looks for `SoftwareApplication` schema with name/version/license/downloadUrl when answering "what is X" queries
|
|
78
|
+
- **Perplexity** — uses JSON-LD as authoritative metadata when summarizing software pages
|
|
79
|
+
- **Bing Copilot** — parses JSON-LD for chat result attribution
|
|
80
|
+
- **Traditional Google Knowledge Panel** — populates from `SoftwareApplication` schemas
|
|
81
|
+
|
|
82
|
+
Without JSON-LD, these crawlers fall back to heuristic HTML parsing of the TypeDoc page — which doesn't have explicit version/license/repo markers in machine-readable form.
|
|
83
|
+
|
|
84
|
+
### Implementation
|
|
85
|
+
|
|
86
|
+
`scripts/inject-jsonld.mjs`:
|
|
87
|
+
- Reads `package.json` for canonical name/version/description/keywords/repo/engines
|
|
88
|
+
- Generates a JSON-LD blob with `@type: SoftwareApplication`, `applicationCategory: DeveloperApplication`, plus author/license/downloadUrl/softwareHelp/codeRepository/programmingLanguage/softwareRequirements/offers
|
|
89
|
+
- Injects as `<script type="application/ld+json">` just before `</head>` in the target HTML file
|
|
90
|
+
- Idempotent — looks for `application/ld+json` marker; skips if already present (so re-runs are safe)
|
|
91
|
+
- Fails fast with clear error if target file is missing or has no `</head>`
|
|
92
|
+
|
|
93
|
+
`.github/workflows/publish-docs.yml`:
|
|
94
|
+
- Added `node scripts/inject-jsonld.mjs docs/api-reference/index.html` step after `npm run docs:api` and before the GH Pages upload-artifact step. Runs on every push to main (same trigger as TypeDoc regen).
|
|
95
|
+
|
|
96
|
+
### Empirical validation
|
|
97
|
+
|
|
98
|
+
Locally:
|
|
99
|
+
```
|
|
100
|
+
$ npm run docs:api # TypeDoc generates docs/api-reference/index.html
|
|
101
|
+
$ grep -c "application/ld+json" docs/api-reference/index.html
|
|
102
|
+
0
|
|
103
|
+
$ node scripts/inject-jsonld.mjs
|
|
104
|
+
[inject-jsonld] injected SoftwareApplication JSON-LD into ... (1713 bytes)
|
|
105
|
+
$ grep -c "application/ld+json" docs/api-reference/index.html
|
|
106
|
+
1
|
|
107
|
+
$ node scripts/inject-jsonld.mjs # idempotent test
|
|
108
|
+
[inject-jsonld] ... already contains JSON-LD; skipping
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Verified the injected JSON-LD parses cleanly (Schema.org validator) and contains the expected `SoftwareApplication` fields with current package.json values.
|
|
112
|
+
|
|
113
|
+
### Stats
|
|
114
|
+
|
|
115
|
+
- **878 tests** (unchanged — pure docs/build-pipeline change).
|
|
116
|
+
- 1 new script: `scripts/inject-jsonld.mjs` (~70 lines).
|
|
117
|
+
- 1 workflow change: 1 new step in `publish-docs.yml`.
|
|
118
|
+
- 0 src/ changes.
|
|
119
|
+
- `npm audit`: 0 vulnerabilities.
|
|
120
|
+
- Dist-tag: `@latest = 3.8.6` after publish.
|
|
121
|
+
- All 9 required CI gates pass locally.
|
|
122
|
+
|
|
123
|
+
### What's next
|
|
124
|
+
|
|
125
|
+
Continuing the no-deferrals run:
|
|
126
|
+
- **v3.8.7** — HTTP P2-10 (stateful session race) + P2-11 (HTTP server close cleanup).
|
|
127
|
+
- **v3.8.8** — META structural-defense scope completeness audit.
|
|
128
|
+
- **v3.9.0-rc.1** — OCR'd PDF watcher embed-sync + HNSW in-memory live update.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
5
132
|
## [3.8.5] — 2026-05-25
|
|
6
133
|
|
|
7
134
|
> **TL;DR:** **T-2/T-3/T-4 E2E backlog closure.** All three E2E tests deferred since v3.8.0 backlog now ship. T-2 (communities handler), T-3 (HyDE search), T-4 (serve-http HTTP smoke) — new `tests/e2e-handlers.test.ts` with 7 tests using spawn-dist + JSON-RPC pattern (mirrors `scripts/smoke.mjs`). T-3 has cheap-path coverage (no embedder needed) + gated full-embedder test behind `ENQUIRE_LOAD_HYDE_E2E=1` env (same pattern as reranker-smoke). T-4 covers health endpoint, bearer-auth rejection, and authenticated MCP initialize handshake. **879 tests** (+7 vs v3.8.4). 0 src/ changes.
|
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
[](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml)
|
|
14
14
|
[](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
|
|
15
15
|
[](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
|
|
16
|
-
[](#trust)
|
|
17
17
|
[](./STABILITY.md)
|
|
18
18
|
[](https://slsa.dev/spec/v1.0/levels#build-l3)
|
|
19
19
|
[](https://modelcontextprotocol.io/)
|
|
@@ -38,7 +38,7 @@ Your Obsidian vault becomes **persistent, queryable long-term memory** for any M
|
|
|
38
38
|
> 2. **Best-in-class retrieval.** Hybrid BM25 + multilingual embeddings + BGE cross-encoder reranker fused via RRF, scaled with HNSW + int8 quantization. The same IR stack a search startup would build — open-sourced, in one binary.
|
|
39
39
|
> 3. **Zero cloud calls during serve.** Models cached locally (one-time download from HuggingFace). Your vault content never leaves your machine. Air-gap-safe by default.
|
|
40
40
|
|
|
41
|
-
**44 tools · 19 MCP prompts ·
|
|
41
|
+
**44 tools · 19 MCP prompts · 888 unit tests · 50+ languages · v3.8.x stable · semver-bound · MIT · SLSA-3 signed.**
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
@@ -176,7 +176,7 @@ Auto-generated **[API reference at oomkapwn.github.io/enquire-mcp](https://oomka
|
|
|
176
176
|
| **GraphRAG-light** (wikilink community detection via Louvain modularity) | ✅ **only here** | ❌ | ❌ |
|
|
177
177
|
| **Standalone `.base` query execution** (works without Obsidian running) | ✅ **only here** | ❌ | ❌ delegates to Obsidian |
|
|
178
178
|
| **HyDE retrieval** (Gao et al 2023) + sub-question decomposition | ✅ **only here** | ❌ | ❌ |
|
|
179
|
-
| **
|
|
179
|
+
| **888 unit tests · 9 required + 4 advisory CI gates per PR** | ✅ | n/a | rare |
|
|
180
180
|
| **SLSA-3 build provenance** | ✅ | n/a | ❌ |
|
|
181
181
|
| **Semver-bound public surface** ([STABILITY.md](./STABILITY.md)) | ✅ | n/a | ❌ |
|
|
182
182
|
| Standalone (no Obsidian plugin needed) | ✅ | ❌ requires Obsidian | varies |
|
|
@@ -286,7 +286,7 @@ Channel: `npm install @oomkapwn/enquire-mcp` → latest stable. Full changelog:
|
|
|
286
286
|
```bash
|
|
287
287
|
git clone https://github.com/oomkapwn/enquire-mcp.git
|
|
288
288
|
cd enquire-mcp && npm install
|
|
289
|
-
npm test # full suite (
|
|
289
|
+
npm test # full suite (888 tests, ~5s)
|
|
290
290
|
npm run lint # zero warnings
|
|
291
291
|
npm run build # tsc → dist/
|
|
292
292
|
```
|
package/dist/http-transport.d.ts
CHANGED
|
@@ -119,17 +119,55 @@ export declare function isInitializeRequest(body: unknown): boolean;
|
|
|
119
119
|
* stateful mode the SDK keys requests by the session id we assign at
|
|
120
120
|
* `initialize` time) and tracks the last activity timestamp for
|
|
121
121
|
* idle-eviction.
|
|
122
|
+
*
|
|
123
|
+
* v3.8.7 P2-10 — added `inFlight` refcount + `closing` flag to make
|
|
124
|
+
* session lifecycle safe under concurrent requests:
|
|
125
|
+
* - `inFlight > 0` means at least one HTTP handler is currently
|
|
126
|
+
* awaiting `transport.handleRequest` on this session. The idle sweep
|
|
127
|
+
* skips such sessions even if their `lastActivityMs` is past the
|
|
128
|
+
* cutoff — closing a transport with an in-flight SSE/POST mid-stream
|
|
129
|
+
* produces broken responses and dangling McpServer state.
|
|
130
|
+
* - `closing` is set by the explicit shutdown paths (DELETE + sweep +
|
|
131
|
+
* `closeAll`) right before we begin teardown. Once true, the entry
|
|
132
|
+
* is also removed from `registry.sessions` so new gets return 404 —
|
|
133
|
+
* concurrent requests that already hold a `session` reference can
|
|
134
|
+
* finish naturally but won't be joined by new ones.
|
|
122
135
|
*/
|
|
123
136
|
interface StatefulSession {
|
|
124
137
|
server: ReturnType<typeof buildMcpServer>;
|
|
125
138
|
transport: InstanceType<typeof StreamableHTTPServerTransport>;
|
|
126
139
|
/** Epoch-ms of the last `handleRequest` for this session. */
|
|
127
140
|
lastActivityMs: number;
|
|
141
|
+
/**
|
|
142
|
+
* v3.8.7 — count of handlers currently inside `transport.handleRequest`
|
|
143
|
+
* for this session. Incremented by `runWithRefcount`. Sweep + closeAll
|
|
144
|
+
* wait for this to drop to 0 before tearing down the transport.
|
|
145
|
+
*/
|
|
146
|
+
inFlight: number;
|
|
147
|
+
/**
|
|
148
|
+
* v3.8.7 — once set, the session is being torn down. The entry has
|
|
149
|
+
* already been removed from `registry.sessions`; new requests will
|
|
150
|
+
* 404. Existing in-flight requests are allowed to finish.
|
|
151
|
+
*/
|
|
152
|
+
closing: boolean;
|
|
128
153
|
}
|
|
129
154
|
/**
|
|
130
155
|
* v2.14.0 — exported for tests so they can poke at the session map
|
|
131
156
|
* directly (idle eviction, max-cap, etc.) without spinning up a real
|
|
132
157
|
* HTTP server.
|
|
158
|
+
*
|
|
159
|
+
* v3.8.7 P2-10/P2-11 — extended:
|
|
160
|
+
* - `pendingInits` makes the maxSessions cap-check atomic across
|
|
161
|
+
* concurrent initialize POSTs. The check is now
|
|
162
|
+
* `sessions.size + pendingInits >= maxSessions`. Each init handler
|
|
163
|
+
* increments before allocating server+transport and decrements in a
|
|
164
|
+
* finally. Without this, N concurrent inits could all pass the
|
|
165
|
+
* plain `size()` check and create N+ sessions.
|
|
166
|
+
* - `closeAll(timeoutMs)` is the graceful-shutdown drain: waits for
|
|
167
|
+
* in-flight requests up to `timeoutMs`, then closes every transport
|
|
168
|
+
* + McpServer pair. Used by `shutdownHttpServer` so tests +
|
|
169
|
+
* production both leave a clean process state (no leaked SQLite
|
|
170
|
+
* handles via the per-session embedder + watcher hooks).
|
|
133
171
|
*/
|
|
134
172
|
export interface SessionRegistry {
|
|
135
173
|
readonly sessions: Map<string, StatefulSession>;
|
|
@@ -137,6 +175,21 @@ export interface SessionRegistry {
|
|
|
137
175
|
sweepIdle(nowMs?: number): number;
|
|
138
176
|
/** Total sessions currently tracked. */
|
|
139
177
|
size(): number;
|
|
178
|
+
/**
|
|
179
|
+
* v3.8.7 — count of in-flight `initialize` POSTs that have passed the
|
|
180
|
+
* cap-check but not yet been inserted into `sessions`. Used by the
|
|
181
|
+
* cap-check to prevent the TOCTOU race where N concurrent inits all
|
|
182
|
+
* see `size() < maxSessions` and overshoot. Public so tests can
|
|
183
|
+
* assert it stays balanced (always returns to 0 after init resolves).
|
|
184
|
+
*/
|
|
185
|
+
pendingInits: number;
|
|
186
|
+
/**
|
|
187
|
+
* v3.8.7 — graceful drain: mark all sessions as `closing`, wait up to
|
|
188
|
+
* `timeoutMs` for in-flight requests to finish, then close every
|
|
189
|
+
* transport + McpServer pair and clear the map. Returns the number of
|
|
190
|
+
* sessions actually closed. Idempotent (second call is a no-op).
|
|
191
|
+
*/
|
|
192
|
+
closeAll(timeoutMs?: number): Promise<number>;
|
|
140
193
|
}
|
|
141
194
|
export declare function createSessionRegistry(idleTimeoutMs: number): SessionRegistry;
|
|
142
195
|
/**
|
|
@@ -157,12 +210,49 @@ export declare function parseMaxFileBytes(raw: string | undefined): number | und
|
|
|
157
210
|
* @internal — exported only for tests.
|
|
158
211
|
*/
|
|
159
212
|
export declare function deriveHttpBodyCap(maxFileBytes: string | undefined): number;
|
|
160
|
-
export declare function createHttpHandler(deps: ServerDeps, opts: HttpServeOptions
|
|
213
|
+
export declare function createHttpHandler(deps: ServerDeps, opts: HttpServeOptions,
|
|
214
|
+
/**
|
|
215
|
+
* v3.8.7 P2-11 — optional out-param. If provided, the function
|
|
216
|
+
* assigns `.registry` to the stateful-mode `SessionRegistry` (or
|
|
217
|
+
* `null` in stateless mode). `startHttpServer` uses this to wire the
|
|
218
|
+
* registry into the `shutdownHttpServer` helper via the
|
|
219
|
+
* `httpServerExtras` WeakMap. Existing call sites that don't pass
|
|
220
|
+
* `out` are unaffected (backwards compatible).
|
|
221
|
+
*/
|
|
222
|
+
out?: {
|
|
223
|
+
registry: SessionRegistry | null;
|
|
224
|
+
}): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
|
|
161
225
|
/**
|
|
162
226
|
* Generate a fresh 32-byte base64url bearer token. Used by the
|
|
163
227
|
* `enquire-mcp gen-token` subcommand.
|
|
164
228
|
*/
|
|
165
229
|
export declare function generateBearerToken(): string;
|
|
230
|
+
/**
|
|
231
|
+
* v3.8.7 P2-11 — graceful shutdown helper for an `http.Server` returned
|
|
232
|
+
* by {@link startHttpServer}. Drains stateful sessions (if any), closes
|
|
233
|
+
* the underlying TCP listener, then closes vault/fts/watcher/embed-db
|
|
234
|
+
* handles owned by `prepareServerDeps`.
|
|
235
|
+
*
|
|
236
|
+
* Without this, callers that pass `installSignalHandlers: false` (the
|
|
237
|
+
* test path, plus anyone managing the process lifecycle externally)
|
|
238
|
+
* would silently leak: `httpServer.close()` alone closes only the TCP
|
|
239
|
+
* accept loop, NOT the per-session McpServer + transport pairs in
|
|
240
|
+
* stateful mode, and NOT the vault/fts/embed-db SQLite handles that
|
|
241
|
+
* `prepareServerDeps` opens once at boot.
|
|
242
|
+
*
|
|
243
|
+
* Order matters:
|
|
244
|
+
* 1. `registry.closeAll()` — bounded wait for in-flight requests to
|
|
245
|
+
* finish, then close every transport + McpServer in stateful mode.
|
|
246
|
+
* 2. `httpServer.close()` — stop accepting new connections + wait for
|
|
247
|
+
* existing ones to drain. Node's http.Server doesn't actively
|
|
248
|
+
* terminate keep-alive sockets unless we ask it to.
|
|
249
|
+
* 3. Close vault, fts5 index, watcher, watcherEmbedDb — same order
|
|
250
|
+
* as the SIGINT cleanup chain in startHttpServer.
|
|
251
|
+
*
|
|
252
|
+
* Idempotent: a second call on the same server is a no-op once extras
|
|
253
|
+
* are unset.
|
|
254
|
+
*/
|
|
255
|
+
export declare function shutdownHttpServer(server: HttpServer): Promise<void>;
|
|
166
256
|
/**
|
|
167
257
|
* Bind and start the HTTP transport. Returns the underlying http.Server
|
|
168
258
|
* so callers (tests + CLI) can listen for `listening` / close it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAgB,KAAK,MAAM,IAAI,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAC/G,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,cAAc,EAAwC,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAGtH;;;;GAIG;AACH,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,mGAAmG;IACnG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;;GAOG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;gBAE3C,SAAS,EAAE,MAAM;IAI7B,6DAA6D;IAC7D,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAmB,GAAG,OAAO;IAiB7D,oCAAoC;IACpC,KAAK,IAAI,IAAI;CAGd;AAED;;;;;;;;;GASG;AACH,iBAAS,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa1F;AAED,8EAA8E;AAC9E,iBAAe,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcpF;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAK1D;AAwED;;;GAGG;AACH
|
|
1
|
+
{"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/http-transport.js
CHANGED
|
@@ -204,24 +204,75 @@ function applyCors(req, res, allowOrigins) {
|
|
|
204
204
|
}
|
|
205
205
|
export function createSessionRegistry(idleTimeoutMs) {
|
|
206
206
|
const sessions = new Map();
|
|
207
|
-
|
|
207
|
+
const registry = {
|
|
208
208
|
sessions,
|
|
209
|
+
pendingInits: 0,
|
|
209
210
|
sweepIdle(nowMs = Date.now()) {
|
|
210
211
|
const cutoff = nowMs - idleTimeoutMs;
|
|
211
212
|
let evicted = 0;
|
|
212
213
|
for (const [sid, session] of sessions) {
|
|
214
|
+
if (session.closing)
|
|
215
|
+
continue; // already being torn down
|
|
216
|
+
// v3.8.7 P2-10 — skip in-flight sessions. Closing a transport
|
|
217
|
+
// while a handler is awaiting handleRequest on it leaves the
|
|
218
|
+
// response stream in an inconsistent state (the SDK's internal
|
|
219
|
+
// queue still expects to drain). Next sweep will catch it once
|
|
220
|
+
// the in-flight request finishes.
|
|
221
|
+
if (session.inFlight > 0)
|
|
222
|
+
continue;
|
|
213
223
|
if (session.lastActivityMs < cutoff) {
|
|
224
|
+
session.closing = true;
|
|
225
|
+
sessions.delete(sid);
|
|
214
226
|
// Best-effort cleanup — don't block on slow close.
|
|
215
227
|
void session.transport.close().catch(() => { });
|
|
216
228
|
void session.server.close().catch(() => { });
|
|
217
|
-
sessions.delete(sid);
|
|
218
229
|
evicted += 1;
|
|
219
230
|
}
|
|
220
231
|
}
|
|
221
232
|
return evicted;
|
|
222
233
|
},
|
|
223
|
-
size: () => sessions.size
|
|
234
|
+
size: () => sessions.size,
|
|
235
|
+
async closeAll(timeoutMs = 5000) {
|
|
236
|
+
// Snapshot the sessions we're closing; mark `closing` synchronously
|
|
237
|
+
// so new requests bounce with 404 while we drain in-flight.
|
|
238
|
+
const snapshot = Array.from(sessions.values());
|
|
239
|
+
for (const s of snapshot)
|
|
240
|
+
s.closing = true;
|
|
241
|
+
sessions.clear();
|
|
242
|
+
// Wait (bounded) for in-flight handlers to finish naturally.
|
|
243
|
+
const deadline = Date.now() + timeoutMs;
|
|
244
|
+
while (Date.now() < deadline) {
|
|
245
|
+
if (snapshot.every((s) => s.inFlight === 0))
|
|
246
|
+
break;
|
|
247
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
248
|
+
}
|
|
249
|
+
// Close everything regardless — best-effort. After timeoutMs an
|
|
250
|
+
// in-flight handler is "stuck" and we'd rather hand back the port
|
|
251
|
+
// than wait forever.
|
|
252
|
+
for (const s of snapshot) {
|
|
253
|
+
await s.transport.close().catch(() => { });
|
|
254
|
+
await s.server.close().catch(() => { });
|
|
255
|
+
}
|
|
256
|
+
return snapshot.length;
|
|
257
|
+
}
|
|
224
258
|
};
|
|
259
|
+
return registry;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* v3.8.7 P2-10 — wrap a `handleRequest` call with the in-flight refcount.
|
|
263
|
+
* The increment is synchronous (no `await` between increment + the work
|
|
264
|
+
* starting), so the idle sweep can never see `inFlight === 0` while a
|
|
265
|
+
* handler is mid-flight. The decrement runs in a `finally` so it fires
|
|
266
|
+
* on both success + rejection paths.
|
|
267
|
+
*/
|
|
268
|
+
async function runWithRefcount(session, fn) {
|
|
269
|
+
session.inFlight += 1;
|
|
270
|
+
try {
|
|
271
|
+
return await fn();
|
|
272
|
+
}
|
|
273
|
+
finally {
|
|
274
|
+
session.inFlight -= 1;
|
|
275
|
+
}
|
|
225
276
|
}
|
|
226
277
|
/**
|
|
227
278
|
* v3.7.12 M4 — parse the `maxFileBytes` ServeOptions field WITHOUT calling
|
|
@@ -251,7 +302,16 @@ export function deriveHttpBodyCap(maxFileBytes) {
|
|
|
251
302
|
const vaultMaxBytes = parseMaxFileBytes(maxFileBytes) ?? DEFAULT_MAX_FILE_BYTES;
|
|
252
303
|
return Math.max(4 * 1024 * 1024, Math.floor(vaultMaxBytes * 1.5));
|
|
253
304
|
}
|
|
254
|
-
export function createHttpHandler(deps, opts
|
|
305
|
+
export function createHttpHandler(deps, opts,
|
|
306
|
+
/**
|
|
307
|
+
* v3.8.7 P2-11 — optional out-param. If provided, the function
|
|
308
|
+
* assigns `.registry` to the stateful-mode `SessionRegistry` (or
|
|
309
|
+
* `null` in stateless mode). `startHttpServer` uses this to wire the
|
|
310
|
+
* registry into the `shutdownHttpServer` helper via the
|
|
311
|
+
* `httpServerExtras` WeakMap. Existing call sites that don't pass
|
|
312
|
+
* `out` are unaffected (backwards compatible).
|
|
313
|
+
*/
|
|
314
|
+
out) {
|
|
255
315
|
const mcpPath = opts.mcpPath ?? "/mcp";
|
|
256
316
|
const healthPath = opts.healthPath ?? "/health";
|
|
257
317
|
const corsOrigins = opts.corsOrigins ?? [];
|
|
@@ -266,6 +326,8 @@ export function createHttpHandler(deps, opts) {
|
|
|
266
326
|
const idleTimeoutMs = opts.sessionIdleTimeoutMs ?? 30 * 60 * 1000; // 30 min default
|
|
267
327
|
const maxSessions = opts.maxSessions ?? 100;
|
|
268
328
|
const registry = stateful ? createSessionRegistry(idleTimeoutMs) : null;
|
|
329
|
+
if (out)
|
|
330
|
+
out.registry = registry;
|
|
269
331
|
return async (req, res) => {
|
|
270
332
|
try {
|
|
271
333
|
applyCors(req, res, corsOrigins);
|
|
@@ -333,23 +395,38 @@ export function createHttpHandler(deps, opts) {
|
|
|
333
395
|
return;
|
|
334
396
|
}
|
|
335
397
|
const session = registry.sessions.get(sessionId);
|
|
336
|
-
if (!session) {
|
|
337
|
-
// Idempotent — if the session is already gone
|
|
398
|
+
if (!session || session.closing) {
|
|
399
|
+
// Idempotent — if the session is already gone (or being torn
|
|
400
|
+
// down), treat as success.
|
|
338
401
|
res.statusCode = 204;
|
|
339
402
|
res.end();
|
|
340
403
|
return;
|
|
341
404
|
}
|
|
342
|
-
//
|
|
343
|
-
//
|
|
405
|
+
// v3.8.7 P2-10 — mark closing + remove from map BEFORE handleRequest.
|
|
406
|
+
// Concurrent gets that arrive during the SDK's protocol-level
|
|
407
|
+
// shutdown then 404 instead of joining a half-closed session.
|
|
408
|
+
// The DELETE itself is in-flight, so we increment the refcount;
|
|
409
|
+
// the actual close waits for that (and any pre-existing in-flight)
|
|
410
|
+
// to drain. (Snapshot the entry locally first — `delete` removes
|
|
411
|
+
// it from the map but the entry stays referenced by `session`.)
|
|
412
|
+
session.closing = true;
|
|
413
|
+
registry.sessions.delete(sessionId);
|
|
344
414
|
try {
|
|
345
|
-
await session.transport.handleRequest(req, res);
|
|
415
|
+
await runWithRefcount(session, () => session.transport.handleRequest(req, res));
|
|
346
416
|
}
|
|
347
417
|
catch {
|
|
348
418
|
/* shutdown errors don't matter — we're killing the session anyway */
|
|
349
419
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
420
|
+
// Drain other in-flight (e.g. an SSE GET held the refcount up)
|
|
421
|
+
// up to a small bound, then close. The bound matches closeAll's
|
|
422
|
+
// default — long enough for normal completion, short enough that
|
|
423
|
+
// a stuck client doesn't pin the McpServer + SQLite handles.
|
|
424
|
+
const deadline = Date.now() + 5000;
|
|
425
|
+
while (session.inFlight > 0 && Date.now() < deadline) {
|
|
426
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
427
|
+
}
|
|
428
|
+
await session.transport.close().catch(() => { });
|
|
429
|
+
await session.server.close().catch(() => { });
|
|
353
430
|
return;
|
|
354
431
|
}
|
|
355
432
|
// GET /mcp — long-lived SSE stream for server-initiated
|
|
@@ -361,13 +438,17 @@ export function createHttpHandler(deps, opts) {
|
|
|
361
438
|
return;
|
|
362
439
|
}
|
|
363
440
|
const session = registry.sessions.get(sessionId);
|
|
364
|
-
|
|
441
|
+
// v3.8.7 P2-10 — also reject `closing` sessions. A closing entry
|
|
442
|
+
// has been removed from `sessions` so this branch is normally
|
|
443
|
+
// unreachable, but the explicit check documents intent + keeps
|
|
444
|
+
// us safe if someone later changes when `closing` is set.
|
|
445
|
+
if (!session || session.closing) {
|
|
365
446
|
sendJsonRpcError(res, 404, -32000, `Unknown session ${sessionId}`);
|
|
366
447
|
return;
|
|
367
448
|
}
|
|
368
449
|
session.lastActivityMs = Date.now();
|
|
369
450
|
try {
|
|
370
|
-
await session.transport.handleRequest(req, res);
|
|
451
|
+
await runWithRefcount(session, () => session.transport.handleRequest(req, res));
|
|
371
452
|
}
|
|
372
453
|
catch (err) {
|
|
373
454
|
process.stderr.write(`enquire http: SSE error — ${err instanceof Error ? err.message : String(err)}\n`);
|
|
@@ -392,13 +473,15 @@ export function createHttpHandler(deps, opts) {
|
|
|
392
473
|
if (sessionId) {
|
|
393
474
|
// Existing session — route to its transport.
|
|
394
475
|
const session = registry.sessions.get(sessionId);
|
|
395
|
-
|
|
476
|
+
// v3.8.7 P2-10 — same `closing` defense as the GET branch. A
|
|
477
|
+
// session marked `closing` is mid-shutdown and not safe to use.
|
|
478
|
+
if (!session || session.closing) {
|
|
396
479
|
sendJsonRpcError(res, 404, -32000, `Unknown session ${sessionId} (it may have expired)`);
|
|
397
480
|
return;
|
|
398
481
|
}
|
|
399
482
|
session.lastActivityMs = Date.now();
|
|
400
483
|
try {
|
|
401
|
-
await session.transport.handleRequest(req, res, body);
|
|
484
|
+
await runWithRefcount(session, () => session.transport.handleRequest(req, res, body));
|
|
402
485
|
}
|
|
403
486
|
catch (err) {
|
|
404
487
|
process.stderr.write(`enquire http: stateful transport error — ${err instanceof Error ? err.message : String(err)}\n`);
|
|
@@ -409,7 +492,11 @@ export function createHttpHandler(deps, opts) {
|
|
|
409
492
|
return;
|
|
410
493
|
}
|
|
411
494
|
// No session id — must be a fresh `initialize`. Cap before allocating.
|
|
412
|
-
|
|
495
|
+
// v3.8.7 P2-10 — include `pendingInits` so concurrent inits that
|
|
496
|
+
// have passed this check but not yet inserted into `sessions`
|
|
497
|
+
// count toward the cap. Without this, the check is a TOCTOU race
|
|
498
|
+
// (N concurrent inits all see `size() < maxSessions` and overshoot).
|
|
499
|
+
if (registry.size() + registry.pendingInits >= maxSessions) {
|
|
413
500
|
res.statusCode = 503;
|
|
414
501
|
res.setHeader("Retry-After", "60");
|
|
415
502
|
res.setHeader("Content-Type", "application/json");
|
|
@@ -436,38 +523,73 @@ export function createHttpHandler(deps, opts) {
|
|
|
436
523
|
sendJsonRpcError(res, 400, -32600, "First POST without Mcp-Session-Id header must be a JSON-RPC `initialize` request");
|
|
437
524
|
return;
|
|
438
525
|
}
|
|
526
|
+
// v3.8.7 P2-10 — reserve the slot synchronously. Between this
|
|
527
|
+
// line and the `onsessioninitialized` callback (which inserts
|
|
528
|
+
// into `sessions`), the cap-check above can see this reservation
|
|
529
|
+
// via `pendingInits` and reject concurrent inits that would
|
|
530
|
+
// overshoot the cap.
|
|
531
|
+
registry.pendingInits += 1;
|
|
439
532
|
// Allocate session: server + transport with a fresh session id.
|
|
440
533
|
// The SDK's `sessionIdGenerator` returns a UUID; the transport
|
|
441
534
|
// sets the `Mcp-Session-Id` response header automatically on
|
|
442
|
-
// initialize.
|
|
535
|
+
// initialize. The session object is constructed up-front so the
|
|
536
|
+
// onsessioninitialized callback can insert it atomically and the
|
|
537
|
+
// refcount wrapper can use it during the initialize POST itself.
|
|
443
538
|
const server = buildMcpServer(deps, opts);
|
|
539
|
+
const session = {
|
|
540
|
+
server,
|
|
541
|
+
// Filled in below once `transport` is constructed.
|
|
542
|
+
transport: null,
|
|
543
|
+
lastActivityMs: Date.now(),
|
|
544
|
+
inFlight: 0,
|
|
545
|
+
closing: false
|
|
546
|
+
};
|
|
444
547
|
const transport = new StreamableHTTPServerTransport({
|
|
445
548
|
sessionIdGenerator: () => randomBytes(16).toString("hex"),
|
|
446
549
|
onsessioninitialized: (sid) => {
|
|
447
550
|
// The SDK guarantees this fires before initialize's response
|
|
448
551
|
// ships, so the entry exists when subsequent requests arrive.
|
|
449
|
-
registry.sessions.set(sid,
|
|
552
|
+
registry.sessions.set(sid, session);
|
|
450
553
|
}
|
|
451
554
|
});
|
|
555
|
+
session.transport = transport;
|
|
452
556
|
// Wire up cleanup on transport close (e.g. client disconnect mid-stream).
|
|
453
557
|
transport.onclose = () => {
|
|
454
558
|
const sid = transport.sessionId;
|
|
455
|
-
if (sid)
|
|
456
|
-
registry.sessions.
|
|
559
|
+
if (sid) {
|
|
560
|
+
const tracked = registry.sessions.get(sid);
|
|
561
|
+
// v3.8.7 P2-10 — only mark + delete if WE inserted this entry.
|
|
562
|
+
// (Defensive — onclose can fire after closeAll already removed
|
|
563
|
+
// it, in which case `tracked` is undefined and there's nothing
|
|
564
|
+
// to do.)
|
|
565
|
+
if (tracked) {
|
|
566
|
+
tracked.closing = true;
|
|
567
|
+
registry.sessions.delete(sid);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
457
570
|
};
|
|
458
571
|
try {
|
|
459
572
|
await server.connect(transport);
|
|
460
|
-
await transport.handleRequest(req, res, body);
|
|
573
|
+
await runWithRefcount(session, () => transport.handleRequest(req, res, body));
|
|
461
574
|
}
|
|
462
575
|
catch (err) {
|
|
463
576
|
process.stderr.write(`enquire http: stateful initialize error — ${err instanceof Error ? err.message : String(err)}\n`);
|
|
464
|
-
// Best-effort: free resources we allocated.
|
|
577
|
+
// Best-effort: free resources we allocated. If the session was
|
|
578
|
+
// already registered, mark it closing + drop from map so concurrent
|
|
579
|
+
// requests don't grab a half-dead entry.
|
|
580
|
+
session.closing = true;
|
|
581
|
+
const sid = transport.sessionId;
|
|
582
|
+
if (sid)
|
|
583
|
+
registry.sessions.delete(sid);
|
|
465
584
|
void transport.close().catch(() => { });
|
|
466
585
|
void server.close().catch(() => { });
|
|
467
586
|
if (!res.headersSent) {
|
|
468
587
|
sendJsonRpcError(res, 500, -32603, "Internal server error");
|
|
469
588
|
}
|
|
470
589
|
}
|
|
590
|
+
finally {
|
|
591
|
+
registry.pendingInits -= 1;
|
|
592
|
+
}
|
|
471
593
|
}
|
|
472
594
|
catch (err) {
|
|
473
595
|
// Final safety net — if anything in the outer block throws (URL
|
|
@@ -519,6 +641,82 @@ async function handleStatelessRequest(req, res, deps, opts, maxBodyBytes) {
|
|
|
519
641
|
export function generateBearerToken() {
|
|
520
642
|
return randomBytes(32).toString("base64url");
|
|
521
643
|
}
|
|
644
|
+
const httpServerExtras = new WeakMap();
|
|
645
|
+
/**
|
|
646
|
+
* v3.8.7 P2-11 — graceful shutdown helper for an `http.Server` returned
|
|
647
|
+
* by {@link startHttpServer}. Drains stateful sessions (if any), closes
|
|
648
|
+
* the underlying TCP listener, then closes vault/fts/watcher/embed-db
|
|
649
|
+
* handles owned by `prepareServerDeps`.
|
|
650
|
+
*
|
|
651
|
+
* Without this, callers that pass `installSignalHandlers: false` (the
|
|
652
|
+
* test path, plus anyone managing the process lifecycle externally)
|
|
653
|
+
* would silently leak: `httpServer.close()` alone closes only the TCP
|
|
654
|
+
* accept loop, NOT the per-session McpServer + transport pairs in
|
|
655
|
+
* stateful mode, and NOT the vault/fts/embed-db SQLite handles that
|
|
656
|
+
* `prepareServerDeps` opens once at boot.
|
|
657
|
+
*
|
|
658
|
+
* Order matters:
|
|
659
|
+
* 1. `registry.closeAll()` — bounded wait for in-flight requests to
|
|
660
|
+
* finish, then close every transport + McpServer in stateful mode.
|
|
661
|
+
* 2. `httpServer.close()` — stop accepting new connections + wait for
|
|
662
|
+
* existing ones to drain. Node's http.Server doesn't actively
|
|
663
|
+
* terminate keep-alive sockets unless we ask it to.
|
|
664
|
+
* 3. Close vault, fts5 index, watcher, watcherEmbedDb — same order
|
|
665
|
+
* as the SIGINT cleanup chain in startHttpServer.
|
|
666
|
+
*
|
|
667
|
+
* Idempotent: a second call on the same server is a no-op once extras
|
|
668
|
+
* are unset.
|
|
669
|
+
*/
|
|
670
|
+
export async function shutdownHttpServer(server) {
|
|
671
|
+
const extras = httpServerExtras.get(server);
|
|
672
|
+
if (!extras) {
|
|
673
|
+
// Already cleaned up (or not from startHttpServer). Still close the
|
|
674
|
+
// TCP listener for safety.
|
|
675
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
678
|
+
httpServerExtras.delete(server);
|
|
679
|
+
try {
|
|
680
|
+
if (extras.registry) {
|
|
681
|
+
await extras.registry.closeAll().catch(() => { });
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
catch {
|
|
685
|
+
/* best-effort */
|
|
686
|
+
}
|
|
687
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
688
|
+
// Close deps last — they own SQLite + chokidar handles that should
|
|
689
|
+
// outlive in-flight requests (which we drained above). Vault doesn't
|
|
690
|
+
// own a SQLite handle (no `close()` method), but it owns the
|
|
691
|
+
// persistent disk cache that we should flush before exit so a
|
|
692
|
+
// SIGKILL-followed-by-cold-start doesn't reread an empty vault.
|
|
693
|
+
if (extras.deps.vault.persistentCacheEnabled) {
|
|
694
|
+
try {
|
|
695
|
+
await extras.deps.vault.saveDiskCache();
|
|
696
|
+
}
|
|
697
|
+
catch {
|
|
698
|
+
/* best-effort */
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
try {
|
|
702
|
+
extras.deps.ftsIndex?.close();
|
|
703
|
+
}
|
|
704
|
+
catch {
|
|
705
|
+
/* best-effort */
|
|
706
|
+
}
|
|
707
|
+
try {
|
|
708
|
+
await extras.deps.watcher?.close();
|
|
709
|
+
}
|
|
710
|
+
catch {
|
|
711
|
+
/* best-effort */
|
|
712
|
+
}
|
|
713
|
+
try {
|
|
714
|
+
extras.deps.watcherEmbedDb?.close();
|
|
715
|
+
}
|
|
716
|
+
catch {
|
|
717
|
+
/* best-effort */
|
|
718
|
+
}
|
|
719
|
+
}
|
|
522
720
|
/**
|
|
523
721
|
* Bind and start the HTTP transport. Returns the underlying http.Server
|
|
524
722
|
* so callers (tests + CLI) can listen for `listening` / close it.
|
|
@@ -529,10 +727,14 @@ export async function startHttpServer(opts) {
|
|
|
529
727
|
"Generate one with: enquire-mcp gen-token");
|
|
530
728
|
}
|
|
531
729
|
const deps = await prepareServerDeps(opts);
|
|
532
|
-
|
|
730
|
+
// v3.8.7 P2-11 — capture the stateful registry via the out-param so
|
|
731
|
+
// we can wire it into `shutdownHttpServer` via the WeakMap below.
|
|
732
|
+
const handlerOut = { registry: null };
|
|
733
|
+
const handler = createHttpHandler(deps, opts, handlerOut);
|
|
533
734
|
const httpServer = createServer((req, res) => {
|
|
534
735
|
void handler(req, res);
|
|
535
736
|
});
|
|
737
|
+
httpServerExtras.set(httpServer, { registry: handlerOut.registry, deps });
|
|
536
738
|
// Persistent-cache flush + watcher cleanup on signal. Same hooks as
|
|
537
739
|
// stdio mode — the deps own the lifecycle. Skipped under
|
|
538
740
|
// installSignalHandlers=false so tests can spawn many servers in one
|
|
@@ -584,10 +786,15 @@ export async function startHttpServer(opts) {
|
|
|
584
786
|
process.on("beforeExit", closeFts);
|
|
585
787
|
}
|
|
586
788
|
// Graceful HTTP-server shutdown on signal.
|
|
789
|
+
// v3.8.7 P2-11 — drain registered stateful sessions BEFORE closing
|
|
790
|
+
// the TCP listener so in-flight requests get a chance to finish and
|
|
791
|
+
// we don't leak per-session McpServer + transport pairs. The
|
|
792
|
+
// pre-existing flush/watcher/fts handlers above still fire (they're
|
|
793
|
+
// registered separately on the same signal) — `shutdownHttpServer`
|
|
794
|
+
// calls them again as a defense-in-depth no-op (idempotent thanks
|
|
795
|
+
// to the WeakMap-delete-on-shutdown pattern).
|
|
587
796
|
const shutdown = () => {
|
|
588
|
-
httpServer.
|
|
589
|
-
// Cascade-close happens via beforeExit hooks.
|
|
590
|
-
});
|
|
797
|
+
void shutdownHttpServer(httpServer).catch(() => { });
|
|
591
798
|
};
|
|
592
799
|
process.once("SIGINT", shutdown);
|
|
593
800
|
process.once("SIGTERM", shutdown);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* + `McpServer({version})`) and `src/tool-registry.ts` (used in the
|
|
8
8
|
* `vault-info` resource payload).
|
|
9
9
|
*/
|
|
10
|
-
export declare const VERSION = "3.8.
|
|
10
|
+
export declare const VERSION = "3.8.7";
|
|
11
11
|
export { main } from "./cli.js";
|
|
12
12
|
export { buildEmbedText, buildMcpServer, formatReadyBanner, prepareServerDeps, type ServeOptions, type ServerDeps, startServer } from "./server.js";
|
|
13
13
|
export { parsePositiveInt, parseQuantizationMode } from "./tool-registry.js";
|
package/dist/index.js
CHANGED
|
@@ -40,7 +40,7 @@ import { main } from "./cli.js";
|
|
|
40
40
|
* + `McpServer({version})`) and `src/tool-registry.ts` (used in the
|
|
41
41
|
* `vault-info` resource payload).
|
|
42
42
|
*/
|
|
43
|
-
export const VERSION = "3.8.
|
|
43
|
+
export const VERSION = "3.8.7";
|
|
44
44
|
// Re-exports — preserve the v3.5.x public surface so http-transport.ts and
|
|
45
45
|
// tests don't need to know about the new module layout. The set below
|
|
46
46
|
// exactly matches the v3.5.x `export` declarations: `main`,
|
package/docs/COMPARISON.md
CHANGED
|
@@ -43,7 +43,7 @@ The four axes the external audit (#3, 2026-05) called out as decisive — **REST
|
|
|
43
43
|
| Read open editor state, active note, etc. | **No** | **Yes** | Limited | No | No |
|
|
44
44
|
| Zero outbound network calls in serve mode | **Yes** (default) | Local-only (REST)| Local-only (REST)| Yes | Yes |
|
|
45
45
|
| SLSA-3 build provenance on releases | **Yes** | No | No | No | No |
|
|
46
|
-
| Test count (public) | **
|
|
46
|
+
| Test count (public) | **888** | (varies) | (varies) | (varies) | (varies) |
|
|
47
47
|
| Tool count | 44 | ~25 | ~8 | ~10 | 3–5 |
|
|
48
48
|
| MCP prompt count | 19 | 0 | 0 | 0 | 0 |
|
|
49
49
|
| License | MIT | Apache-2.0 | MIT | MIT | (varies) |
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@oomkapwn/enquire-mcp",
|
|
4
|
-
"version": "3.8.
|
|
4
|
+
"version": "3.8.7",
|
|
5
5
|
"mcpName": "io.github.oomkapwn/enquire-mcp",
|
|
6
|
-
"description": "MCP server giving AI agents (Claude Code, Claude Desktop, Cursor, ChatGPT, Codex, OpenClaw) persistent long-term memory backed by your local Obsidian markdown vault. Hybrid retrieval (BM25 + ML embeddings + BGE reranker, RRF-fused), HNSW + int8 quantization, agentic RAG (HyDE + sub-question decomposition), GraphRAG-light (Louvain), standalone Obsidian Bases, PDFs + Tesseract OCR. Vendor-neutral memory layer for any MCP-compatible agent. 44 tools, 19 MCP prompts,
|
|
6
|
+
"description": "MCP server giving AI agents (Claude Code, Claude Desktop, Cursor, ChatGPT, Codex, OpenClaw) persistent long-term memory backed by your local Obsidian markdown vault. Hybrid retrieval (BM25 + ML embeddings + BGE reranker, RRF-fused), HNSW + int8 quantization, agentic RAG (HyDE + sub-question decomposition), GraphRAG-light (Louvain), standalone Obsidian Bases, PDFs + Tesseract OCR. Vendor-neutral memory layer for any MCP-compatible agent. 44 tools, 19 MCP prompts, 888 tests, SLSA-3, semver-bound, MIT, zero cloud calls during serve.",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"bin": {
|
|
9
9
|
"enquire-mcp": "dist/index.js"
|