daftari 1.30.0 → 1.32.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/CHANGELOG.md +176 -0
- package/README.md +188 -4
- package/dist/access/rbac.d.ts +1 -0
- package/dist/access/rbac.d.ts.map +1 -1
- package/dist/access/rbac.js +7 -0
- package/dist/access/rbac.js.map +1 -1
- package/dist/audit/checks/broken_refs.d.ts +1 -1
- package/dist/audit/checks/broken_refs.d.ts.map +1 -1
- package/dist/audit/checks/broken_refs.js +77 -22
- package/dist/audit/checks/broken_refs.js.map +1 -1
- package/dist/audit/collect.d.ts +1 -0
- package/dist/audit/collect.d.ts.map +1 -1
- package/dist/audit/collect.js +22 -2
- package/dist/audit/collect.js.map +1 -1
- package/dist/audit/index.d.ts.map +1 -1
- package/dist/audit/index.js +9 -3
- package/dist/audit/index.js.map +1 -1
- package/dist/audit/links.d.ts.map +1 -1
- package/dist/audit/links.js +9 -3
- package/dist/audit/links.js.map +1 -1
- package/dist/audit/report.d.ts.map +1 -1
- package/dist/audit/report.js +2 -0
- package/dist/audit/report.js.map +1 -1
- package/dist/audit/types.d.ts +4 -1
- package/dist/audit/types.d.ts.map +1 -1
- package/dist/audit/types.js.map +1 -1
- package/dist/backfill/derive.d.ts.map +1 -1
- package/dist/backfill/derive.js +1 -0
- package/dist/backfill/derive.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +24 -0
- package/dist/cli.js.map +1 -1
- package/dist/consolidate/index.d.ts.map +1 -1
- package/dist/consolidate/index.js +10 -12
- package/dist/consolidate/index.js.map +1 -1
- package/dist/court/precedent.d.ts.map +1 -1
- package/dist/court/precedent.js +6 -1
- package/dist/court/precedent.js.map +1 -1
- package/dist/curation/consumes.d.ts +24 -0
- package/dist/curation/consumes.d.ts.map +1 -0
- package/dist/curation/consumes.js +122 -0
- package/dist/curation/consumes.js.map +1 -0
- package/dist/curation/edge-staleness.d.ts +47 -0
- package/dist/curation/edge-staleness.d.ts.map +1 -0
- package/dist/curation/edge-staleness.js +258 -0
- package/dist/curation/edge-staleness.js.map +1 -0
- package/dist/curation/edges.d.ts.map +1 -1
- package/dist/curation/edges.js +190 -17
- package/dist/curation/edges.js.map +1 -1
- package/dist/curation/lint.d.ts +6 -1
- package/dist/curation/lint.d.ts.map +1 -1
- package/dist/curation/lint.js +87 -24
- package/dist/curation/lint.js.map +1 -1
- package/dist/curation/provenance.d.ts +2 -0
- package/dist/curation/provenance.d.ts.map +1 -1
- package/dist/curation/provenance.js +2 -0
- package/dist/curation/provenance.js.map +1 -1
- package/dist/curation/read-log.d.ts +19 -0
- package/dist/curation/read-log.d.ts.map +1 -0
- package/dist/curation/read-log.js +120 -0
- package/dist/curation/read-log.js.map +1 -0
- package/dist/curation/review-throughput.d.ts +24 -0
- package/dist/curation/review-throughput.d.ts.map +1 -0
- package/dist/curation/review-throughput.js +102 -0
- package/dist/curation/review-throughput.js.map +1 -0
- package/dist/curation/shadow.d.ts +1 -0
- package/dist/curation/shadow.d.ts.map +1 -1
- package/dist/curation/shadow.js +17 -11
- package/dist/curation/shadow.js.map +1 -1
- package/dist/curation/staged-actions.d.ts +12 -1
- package/dist/curation/staged-actions.d.ts.map +1 -1
- package/dist/curation/staged-actions.js +123 -48
- package/dist/curation/staged-actions.js.map +1 -1
- package/dist/curation/structural.d.ts +16 -0
- package/dist/curation/structural.d.ts.map +1 -0
- package/dist/curation/structural.js +64 -0
- package/dist/curation/structural.js.map +1 -0
- package/dist/curation/tension-blast.d.ts +4 -0
- package/dist/curation/tension-blast.d.ts.map +1 -1
- package/dist/curation/tension-blast.js +9 -0
- package/dist/curation/tension-blast.js.map +1 -1
- package/dist/curation/tension.d.ts +5 -2
- package/dist/curation/tension.d.ts.map +1 -1
- package/dist/curation/tension.js +68 -25
- package/dist/curation/tension.js.map +1 -1
- package/dist/curation/tier0.d.ts +27 -0
- package/dist/curation/tier0.d.ts.map +1 -0
- package/dist/curation/tier0.js +196 -0
- package/dist/curation/tier0.js.map +1 -0
- package/dist/curation/tier1.d.ts +30 -0
- package/dist/curation/tier1.d.ts.map +1 -0
- package/dist/curation/tier1.js +142 -0
- package/dist/curation/tier1.js.map +1 -0
- package/dist/curation/tier2.d.ts +43 -0
- package/dist/curation/tier2.d.ts.map +1 -0
- package/dist/curation/tier2.js +182 -0
- package/dist/curation/tier2.js.map +1 -0
- package/dist/curation/vault-docs.d.ts +5 -1
- package/dist/curation/vault-docs.d.ts.map +1 -1
- package/dist/curation/vault-docs.js +14 -0
- package/dist/curation/vault-docs.js.map +1 -1
- package/dist/eval/generate.d.ts.map +1 -1
- package/dist/eval/generate.js +38 -5
- package/dist/eval/generate.js.map +1 -1
- package/dist/eval/index.d.ts +1 -0
- package/dist/eval/index.d.ts.map +1 -1
- package/dist/eval/index.js +249 -50
- package/dist/eval/index.js.map +1 -1
- package/dist/eval/llm-openrouter.d.ts.map +1 -1
- package/dist/eval/llm-openrouter.js +158 -65
- package/dist/eval/llm-openrouter.js.map +1 -1
- package/dist/eval/llm.js +1 -1
- package/dist/eval/llm.js.map +1 -1
- package/dist/eval/prune.d.ts +24 -0
- package/dist/eval/prune.d.ts.map +1 -0
- package/dist/eval/prune.js +83 -0
- package/dist/eval/prune.js.map +1 -0
- package/dist/eval/storage.d.ts +3 -0
- package/dist/eval/storage.d.ts.map +1 -1
- package/dist/eval/storage.js +14 -0
- package/dist/eval/storage.js.map +1 -1
- package/dist/frontmatter/schema.d.ts.map +1 -1
- package/dist/frontmatter/schema.js +19 -1
- package/dist/frontmatter/schema.js.map +1 -1
- package/dist/frontmatter/types.d.ts +4 -1
- package/dist/frontmatter/types.d.ts.map +1 -1
- package/dist/frontmatter/types.js +8 -0
- package/dist/frontmatter/types.js.map +1 -1
- package/dist/import/index.d.ts.map +1 -1
- package/dist/import/index.js +44 -9
- package/dist/import/index.js.map +1 -1
- package/dist/import/langgraph-store.d.ts +53 -0
- package/dist/import/langgraph-store.d.ts.map +1 -0
- package/dist/import/langgraph-store.js +292 -0
- package/dist/import/langgraph-store.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +56 -18
- package/dist/index.js.map +1 -1
- package/dist/interview/index.d.ts +7 -0
- package/dist/interview/index.d.ts.map +1 -0
- package/dist/interview/index.js +219 -0
- package/dist/interview/index.js.map +1 -0
- package/dist/interview/questions.d.ts +18 -0
- package/dist/interview/questions.d.ts.map +1 -0
- package/dist/interview/questions.js +169 -0
- package/dist/interview/questions.js.map +1 -0
- package/dist/interview/transcript.d.ts +23 -0
- package/dist/interview/transcript.d.ts.map +1 -0
- package/dist/interview/transcript.js +155 -0
- package/dist/interview/transcript.js.map +1 -0
- package/dist/lifecycle/lock.d.ts +9 -1
- package/dist/lifecycle/lock.d.ts.map +1 -1
- package/dist/lifecycle/lock.js +34 -9
- package/dist/lifecycle/lock.js.map +1 -1
- package/dist/okf/export.d.ts +12 -0
- package/dist/okf/export.d.ts.map +1 -0
- package/dist/okf/export.js +117 -0
- package/dist/okf/export.js.map +1 -0
- package/dist/okf/import.d.ts +24 -0
- package/dist/okf/import.d.ts.map +1 -0
- package/dist/okf/import.js +115 -0
- package/dist/okf/import.js.map +1 -0
- package/dist/okf/index.d.ts +2 -0
- package/dist/okf/index.d.ts.map +1 -0
- package/dist/okf/index.js +159 -0
- package/dist/okf/index.js.map +1 -0
- package/dist/okf/map.d.ts +27 -0
- package/dist/okf/map.d.ts.map +1 -0
- package/dist/okf/map.js +327 -0
- package/dist/okf/map.js.map +1 -0
- package/dist/okf/types.d.ts +13 -0
- package/dist/okf/types.d.ts.map +1 -0
- package/dist/okf/types.js +82 -0
- package/dist/okf/types.js.map +1 -0
- package/dist/search/coverage.d.ts.map +1 -1
- package/dist/search/coverage.js +1 -1
- package/dist/search/coverage.js.map +1 -1
- package/dist/search/hybrid.d.ts +19 -0
- package/dist/search/hybrid.d.ts.map +1 -1
- package/dist/search/hybrid.js +60 -15
- package/dist/search/hybrid.js.map +1 -1
- package/dist/search/reindex.d.ts +4 -0
- package/dist/search/reindex.d.ts.map +1 -1
- package/dist/search/reindex.js +64 -14
- package/dist/search/reindex.js.map +1 -1
- package/dist/search/watcher.d.ts +2 -0
- package/dist/search/watcher.d.ts.map +1 -1
- package/dist/search/watcher.js +29 -27
- package/dist/search/watcher.js.map +1 -1
- package/dist/serve/index.d.ts +36 -0
- package/dist/serve/index.d.ts.map +1 -0
- package/dist/serve/index.js +507 -0
- package/dist/serve/index.js.map +1 -0
- package/dist/server.d.ts +10 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +89 -14
- package/dist/server.js.map +1 -1
- package/dist/sleep/index.d.ts +2 -0
- package/dist/sleep/index.d.ts.map +1 -1
- package/dist/sleep/index.js +212 -21
- package/dist/sleep/index.js.map +1 -1
- package/dist/sleep/report.d.ts +3 -0
- package/dist/sleep/report.d.ts.map +1 -1
- package/dist/sleep/report.js +52 -0
- package/dist/sleep/report.js.map +1 -1
- package/dist/sleep/tension-scan-state.d.ts +19 -0
- package/dist/sleep/tension-scan-state.d.ts.map +1 -0
- package/dist/sleep/tension-scan-state.js +0 -0
- package/dist/sleep/tension-scan-state.js.map +1 -0
- package/dist/sleep/tension-scan.d.ts +44 -0
- package/dist/sleep/tension-scan.d.ts.map +1 -0
- package/dist/sleep/tension-scan.js +0 -0
- package/dist/sleep/tension-scan.js.map +1 -0
- package/dist/storage/backend.d.ts +12 -0
- package/dist/storage/backend.d.ts.map +1 -0
- package/dist/storage/backend.js +231 -0
- package/dist/storage/backend.js.map +1 -0
- package/dist/storage/backends/fs.d.ts +4 -0
- package/dist/storage/backends/fs.d.ts.map +1 -0
- package/dist/storage/backends/fs.js +99 -0
- package/dist/storage/backends/fs.js.map +1 -0
- package/dist/storage/fs-walk.d.ts +5 -0
- package/dist/storage/fs-walk.d.ts.map +1 -0
- package/dist/storage/fs-walk.js +28 -0
- package/dist/storage/fs-walk.js.map +1 -0
- package/dist/storage/index-db.d.ts +16 -0
- package/dist/storage/index-db.d.ts.map +1 -1
- package/dist/storage/index-db.js +95 -5
- package/dist/storage/index-db.js.map +1 -1
- package/dist/storage/local.d.ts +1 -0
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +12 -0
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/sync.d.ts +25 -0
- package/dist/storage/sync.d.ts.map +1 -0
- package/dist/storage/sync.js +308 -0
- package/dist/storage/sync.js.map +1 -0
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +136 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/themes/clustering.d.ts +6 -11
- package/dist/themes/clustering.d.ts.map +1 -1
- package/dist/themes/clustering.js +76 -84
- package/dist/themes/clustering.js.map +1 -1
- package/dist/tools/consumes.d.ts +14 -0
- package/dist/tools/consumes.d.ts.map +1 -0
- package/dist/tools/consumes.js +99 -0
- package/dist/tools/consumes.js.map +1 -0
- package/dist/tools/curation.d.ts +2 -0
- package/dist/tools/curation.d.ts.map +1 -1
- package/dist/tools/curation.js +53 -15
- package/dist/tools/curation.js.map +1 -1
- package/dist/tools/edge-staleness.d.ts +28 -0
- package/dist/tools/edge-staleness.d.ts.map +1 -0
- package/dist/tools/edge-staleness.js +205 -0
- package/dist/tools/edge-staleness.js.map +1 -0
- package/dist/tools/edges.d.ts.map +1 -1
- package/dist/tools/edges.js +27 -21
- package/dist/tools/edges.js.map +1 -1
- package/dist/tools/read.d.ts +15 -1
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +211 -76
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/receipt.d.ts.map +1 -1
- package/dist/tools/receipt.js +16 -7
- package/dist/tools/receipt.js.map +1 -1
- package/dist/tools/search.d.ts +1 -0
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +147 -5
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/staged-actions.d.ts +3 -0
- package/dist/tools/staged-actions.d.ts.map +1 -1
- package/dist/tools/staged-actions.js +225 -22
- package/dist/tools/staged-actions.js.map +1 -1
- package/dist/tools/themes.d.ts +8 -0
- package/dist/tools/themes.d.ts.map +1 -1
- package/dist/tools/themes.js +208 -122
- package/dist/tools/themes.js.map +1 -1
- package/dist/tools/tier1.d.ts +14 -0
- package/dist/tools/tier1.d.ts.map +1 -0
- package/dist/tools/tier1.js +169 -0
- package/dist/tools/tier1.js.map +1 -0
- package/dist/tools/tier2.d.ts +27 -0
- package/dist/tools/tier2.d.ts.map +1 -0
- package/dist/tools/tier2.js +344 -0
- package/dist/tools/tier2.js.map +1 -0
- package/dist/tools/write.d.ts +9 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +596 -174
- package/dist/tools/write.js.map +1 -1
- package/dist/utils/config.d.ts +52 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +394 -24
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/dates.d.ts +1 -0
- package/dist/utils/dates.d.ts.map +1 -1
- package/dist/utils/dates.js +5 -0
- package/dist/utils/dates.js.map +1 -1
- package/dist/utils/run-id.d.ts +3 -0
- package/dist/utils/run-id.d.ts.map +1 -0
- package/dist/utils/run-id.js +19 -0
- package/dist/utils/run-id.js.map +1 -0
- package/dist/utils/vault-gitignore.d.ts +1 -1
- package/dist/utils/vault-gitignore.d.ts.map +1 -1
- package/dist/utils/vault-gitignore.js +4 -1
- package/dist/utils/vault-gitignore.js.map +1 -1
- package/package.json +21 -1
- package/templates/config.yaml +8 -0
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
// `daftari serve` (#5, spec 2026-07-20) — server mode over Streamable HTTP.
|
|
2
|
+
//
|
|
3
|
+
// One always-on instance, many MCP clients. The mechanical core: createServer
|
|
4
|
+
// already parameterizes the access context, so each MCP session gets its own
|
|
5
|
+
// Server bound to the identity resolved when the session opened — no tool
|
|
6
|
+
// handler changes, and every RBAC/existence-disclosure invariant applies
|
|
7
|
+
// per session, transport-independently.
|
|
8
|
+
//
|
|
9
|
+
// Fail-loud rules (all from the spec, all startup or session-open errors,
|
|
10
|
+
// never silent downgrades):
|
|
11
|
+
// - non-loopback bind requires auth configured AND
|
|
12
|
+
// server.transport_security: external declared;
|
|
13
|
+
// - a token entry whose env var is unset, or whose role is not declared,
|
|
14
|
+
// refuses to start;
|
|
15
|
+
// - once auth is configured, a missing/unmatched bearer token is rejected
|
|
16
|
+
// at session open (401) on every bind — never downgraded to guest;
|
|
17
|
+
// - the deny-all guest exists only in the no-auth loopback configuration.
|
|
18
|
+
import { randomUUID, timingSafeEqual } from "node:crypto";
|
|
19
|
+
import { createServer as createHttpServer, } from "node:http";
|
|
20
|
+
import { resolve } from "node:path";
|
|
21
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
22
|
+
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
23
|
+
import { createRemoteJWKSet, jwtVerify } from "jose";
|
|
24
|
+
import { GUEST_ROLE, resolveAccess } from "../access/rbac.js";
|
|
25
|
+
import { ok } from "../frontmatter/types.js";
|
|
26
|
+
import { installShutdownHandlers, parseFlag, startVaultServices } from "../index.js";
|
|
27
|
+
import { acquireLock } from "../lifecycle/lock.js";
|
|
28
|
+
import { setProvider } from "../search/vector.js";
|
|
29
|
+
import { createServer, resolveToolExposure, SERVER_VERSION } from "../server.js";
|
|
30
|
+
import { createBackend } from "../storage/backend.js";
|
|
31
|
+
import { directoryExists } from "../storage/local.js";
|
|
32
|
+
import { syncVault } from "../storage/sync.js";
|
|
33
|
+
import { loadConfig } from "../utils/config.js";
|
|
34
|
+
export const DEFAULT_PORT = 8787;
|
|
35
|
+
export const DEFAULT_BIND = "127.0.0.1";
|
|
36
|
+
const HELP = `daftari serve — server mode over Streamable HTTP (spec 2026-07-20).
|
|
37
|
+
|
|
38
|
+
Usage:
|
|
39
|
+
daftari serve --vault <path> [--port <n>] [--bind <addr>] [--takeover]
|
|
40
|
+
|
|
41
|
+
Defaults:
|
|
42
|
+
--port ${DEFAULT_PORT}
|
|
43
|
+
--bind ${DEFAULT_BIND} (loopback; non-loopback binds require auth AND
|
|
44
|
+
server.transport_security: external in config)
|
|
45
|
+
|
|
46
|
+
--takeover deliberately replace a LIVE daftari holding this vault
|
|
47
|
+
(a plain serve refuses against any live holder)
|
|
48
|
+
|
|
49
|
+
Endpoint: http://<bind>:<port>/mcp (MCP Streamable HTTP)
|
|
50
|
+
|
|
51
|
+
Auth: clients send "Authorization: Bearer <token>". Two composable schemes:
|
|
52
|
+
server.auth.tokens — static tokens; values come from the env vars named in
|
|
53
|
+
config, never from config itself.
|
|
54
|
+
server.auth.oauth — OAuth 2.1 resource-server validation: bearer JWTs are
|
|
55
|
+
verified against the IdP's JWKS (issuer + audience + expiry) and the
|
|
56
|
+
subject claim maps through the declared subjects table. A valid token
|
|
57
|
+
with an unmapped subject is 403 (authenticated, not authorized).
|
|
58
|
+
With any auth configured, a missing/invalid credential is a 401 at session
|
|
59
|
+
open — never a guest downgrade; with no auth (loopback only), sessions run
|
|
60
|
+
as the deny-all guest.
|
|
61
|
+
|
|
62
|
+
Exit codes: 2 config/usage error, 3 runtime error.
|
|
63
|
+
`;
|
|
64
|
+
const LOOPBACK_BINDS = new Set(["127.0.0.1", "::1", "localhost"]);
|
|
65
|
+
export function isLoopbackBind(bind) {
|
|
66
|
+
return LOOPBACK_BINDS.has(bind);
|
|
67
|
+
}
|
|
68
|
+
// Pure startup gating (#5): everything that must refuse before a socket
|
|
69
|
+
// opens. Exported for direct tests — the rules matter more than the wiring.
|
|
70
|
+
export function validateServeStartup(config, bind, env) {
|
|
71
|
+
const authConfigured = config.server.tokens.length > 0 || config.server.oauth !== undefined;
|
|
72
|
+
if (!isLoopbackBind(bind)) {
|
|
73
|
+
if (!authConfigured) {
|
|
74
|
+
return {
|
|
75
|
+
ok: false,
|
|
76
|
+
error: `refusing to bind ${bind} with no authentication configured — ` +
|
|
77
|
+
`declare server.auth.tokens and/or server.auth.oauth in .daftari/config.yaml`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (config.server.transportSecurity !== "external") {
|
|
81
|
+
return {
|
|
82
|
+
ok: false,
|
|
83
|
+
error: `refusing to bind ${bind}: declare server.transport_security: ` +
|
|
84
|
+
`"external" to acknowledge that TLS terminates upstream (or the ` +
|
|
85
|
+
`network is trusted); daftari never terminates TLS itself`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const tokens = [];
|
|
90
|
+
for (const t of config.server.tokens) {
|
|
91
|
+
const value = env[t.env];
|
|
92
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
93
|
+
return {
|
|
94
|
+
ok: false,
|
|
95
|
+
error: `server.auth.tokens entry for ${t.user} names env var ${t.env}, which is not set`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (!(t.role in config.roles)) {
|
|
99
|
+
return {
|
|
100
|
+
ok: false,
|
|
101
|
+
error: `server.auth.tokens entry for ${t.user} names role '${t.role}', ` +
|
|
102
|
+
`which is not declared in config roles`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
tokens.push({ secret: Buffer.from(value, "utf-8"), user: t.user, roleName: t.role });
|
|
106
|
+
}
|
|
107
|
+
// OAuth (#7): the block's shape was validated at config load; startup
|
|
108
|
+
// verifies what only this process can — URL parseability and that every
|
|
109
|
+
// mapped role is declared, the same loud posture as the token entries.
|
|
110
|
+
const oauth = config.server.oauth;
|
|
111
|
+
if (oauth) {
|
|
112
|
+
for (const field of [oauth.issuer, oauth.jwksUri]) {
|
|
113
|
+
let parsed;
|
|
114
|
+
try {
|
|
115
|
+
parsed = new URL(field);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return { ok: false, error: `server.auth.oauth: '${field}' is not a valid URL` };
|
|
119
|
+
}
|
|
120
|
+
// JWKS/issuer over plaintext http would let a network-position
|
|
121
|
+
// attacker serve a forged key set and mint arbitrary authorized
|
|
122
|
+
// sessions — https only, with loopback http as the sole escape hatch
|
|
123
|
+
// (local test IdPs; no network position exists on the host itself).
|
|
124
|
+
// URL.hostname keeps IPv6 brackets ("[::1]"); strip them so the
|
|
125
|
+
// loopback set (written for bare --bind values) matches.
|
|
126
|
+
const loopbackHost = isLoopbackBind(parsed.hostname.replace(/^\[|\]$/g, ""));
|
|
127
|
+
if (parsed.protocol !== "https:" && !(parsed.protocol === "http:" && loopbackHost)) {
|
|
128
|
+
return {
|
|
129
|
+
ok: false,
|
|
130
|
+
error: `server.auth.oauth: '${field}' must use https ` +
|
|
131
|
+
`(plain http is allowed only for loopback test IdPs)`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
for (const [subject, entry] of Object.entries(oauth.subjects)) {
|
|
136
|
+
if (!(entry.role in config.roles)) {
|
|
137
|
+
return {
|
|
138
|
+
ok: false,
|
|
139
|
+
error: `server.auth.oauth.subjects entry for ${subject} names role ` +
|
|
140
|
+
`'${entry.role}', which is not declared in config roles`,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return { ok: true, tokens };
|
|
146
|
+
}
|
|
147
|
+
// Constant-time match of the presented bearer against every configured
|
|
148
|
+
// secret. Iterates the FULL list regardless of an early match, so response
|
|
149
|
+
// timing does not reveal which (or whether any) entry matched.
|
|
150
|
+
export function matchToken(presented, tokens) {
|
|
151
|
+
const presentedBuf = Buffer.from(presented, "utf-8");
|
|
152
|
+
let matched = null;
|
|
153
|
+
for (const t of tokens) {
|
|
154
|
+
const sameLength = presentedBuf.length === t.secret.length;
|
|
155
|
+
// timingSafeEqual requires equal lengths; compare against self when the
|
|
156
|
+
// lengths differ so every candidate costs one comparison either way.
|
|
157
|
+
const equal = timingSafeEqual(sameLength ? presentedBuf : t.secret, t.secret);
|
|
158
|
+
if (sameLength && equal && matched === null)
|
|
159
|
+
matched = t;
|
|
160
|
+
}
|
|
161
|
+
return matched;
|
|
162
|
+
}
|
|
163
|
+
function bearerFrom(req) {
|
|
164
|
+
const header = req.headers.authorization;
|
|
165
|
+
if (typeof header !== "string")
|
|
166
|
+
return null;
|
|
167
|
+
const m = /^Bearer\s+(.+)$/.exec(header);
|
|
168
|
+
return m ? m[1] : null;
|
|
169
|
+
}
|
|
170
|
+
function writeJson(res, status, body) {
|
|
171
|
+
res.writeHead(status, { "content-type": "application/json" });
|
|
172
|
+
res.end(JSON.stringify(body));
|
|
173
|
+
}
|
|
174
|
+
function readBody(req) {
|
|
175
|
+
return new Promise((resolveBody, rejectBody) => {
|
|
176
|
+
const chunks = [];
|
|
177
|
+
req.on("data", (c) => chunks.push(c));
|
|
178
|
+
req.on("end", () => {
|
|
179
|
+
const raw = Buffer.concat(chunks).toString("utf-8");
|
|
180
|
+
if (raw.length === 0) {
|
|
181
|
+
resolveBody(undefined);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
resolveBody(JSON.parse(raw));
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
rejectBody(e);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
req.on("error", rejectBody);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
export function makeLoopbackGuard(port) {
|
|
195
|
+
const spellings = ["127.0.0.1", "localhost", "[::1]"];
|
|
196
|
+
return {
|
|
197
|
+
hosts: new Set(spellings.map((h) => `${h}:${port}`)),
|
|
198
|
+
origins: new Set(spellings.map((h) => `http://${h}:${port}`)),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
export function violatesLoopbackGuard(guard, host, origin) {
|
|
202
|
+
if (!host || !guard.hosts.has(host)) {
|
|
203
|
+
return `Host header '${host ?? "<missing>"}' is not a loopback address for this server`;
|
|
204
|
+
}
|
|
205
|
+
if (origin !== undefined && !guard.origins.has(origin)) {
|
|
206
|
+
return `Origin '${origin}' is not allowed on a loopback bind`;
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
export function startHttpServer(vaultRoot, config, tokens, bind, port) {
|
|
211
|
+
const sessions = new Map();
|
|
212
|
+
const oauth = config.server.oauth;
|
|
213
|
+
const authConfigured = tokens.length > 0 || oauth !== undefined;
|
|
214
|
+
// JWKS key set, created lazily on the first OAuth verification: jose
|
|
215
|
+
// caches fetched keys, so the server stays stateless and offline-tolerant
|
|
216
|
+
// after the first fetch (spec Decision 2, phase 2).
|
|
217
|
+
let jwks = null;
|
|
218
|
+
// Set once the listener is up (the ephemeral-port case needs the BOUND
|
|
219
|
+
// port); no request can arrive before listen resolves.
|
|
220
|
+
let loopbackGuard = null;
|
|
221
|
+
// Resolves the request's identity under the spec's session rules, or
|
|
222
|
+
// writes the rejection and returns null. With auth configured:
|
|
223
|
+
// - a static-token match binds its declared identity;
|
|
224
|
+
// - else, with oauth declared, a bearer that verifies against the IdP's
|
|
225
|
+
// JWKS (issuer + audience + signature + expiry) maps its subject claim
|
|
226
|
+
// through the declared table — a valid-but-unmapped subject is 403
|
|
227
|
+
// (authenticated, not authorized), NEVER guest;
|
|
228
|
+
// - anything else is 401. With no auth at all (startup gating
|
|
229
|
+
// guarantees loopback) every session is the deny-all guest.
|
|
230
|
+
const authenticate = async (req, res) => {
|
|
231
|
+
if (!authConfigured) {
|
|
232
|
+
return resolveAccess(config, "guest", GUEST_ROLE);
|
|
233
|
+
}
|
|
234
|
+
const presented = bearerFrom(req);
|
|
235
|
+
if (presented !== null) {
|
|
236
|
+
const matched = matchToken(presented, tokens);
|
|
237
|
+
if (matched !== null) {
|
|
238
|
+
return resolveAccess(config, matched.user, matched.roleName);
|
|
239
|
+
}
|
|
240
|
+
if (oauth) {
|
|
241
|
+
try {
|
|
242
|
+
jwks ??= createRemoteJWKSet(new URL(oauth.jwksUri));
|
|
243
|
+
const verified = await jwtVerify(presented, jwks, {
|
|
244
|
+
issuer: oauth.issuer,
|
|
245
|
+
audience: oauth.audience,
|
|
246
|
+
});
|
|
247
|
+
const subject = verified.payload.sub;
|
|
248
|
+
// Own-property lookup only: `subjects` is a plain object, and a
|
|
249
|
+
// sub claim like "constructor" or "toString" would otherwise hit
|
|
250
|
+
// an inherited Object.prototype member and skip the 403.
|
|
251
|
+
const mapped = subject !== undefined && Object.hasOwn(oauth.subjects, subject)
|
|
252
|
+
? oauth.subjects[subject]
|
|
253
|
+
: undefined;
|
|
254
|
+
if (mapped === undefined) {
|
|
255
|
+
writeJson(res, 403, {
|
|
256
|
+
error: "forbidden",
|
|
257
|
+
message: "authenticated subject has no declared role mapping",
|
|
258
|
+
});
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
return resolveAccess(config, mapped.user, mapped.role);
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
// Signature/issuer/audience/expiry failure — an invalid
|
|
265
|
+
// credential, not an unmapped one: 401 below.
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
writeJson(res, 401, {
|
|
270
|
+
error: "unauthorized",
|
|
271
|
+
message: "a valid bearer token is required",
|
|
272
|
+
});
|
|
273
|
+
return null;
|
|
274
|
+
};
|
|
275
|
+
const httpServer = createHttpServer((req, res) => {
|
|
276
|
+
void handle(req, res).catch((e) => {
|
|
277
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
278
|
+
if (!res.headersSent) {
|
|
279
|
+
writeJson(res, 500, { error: "internal", message: reason });
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
res.end();
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
async function handle(req, res) {
|
|
287
|
+
// Rebinding guard runs FIRST — before routing, before auth — so no
|
|
288
|
+
// response (including 404s and 401 bodies) reaches a rebinded page.
|
|
289
|
+
if (loopbackGuard) {
|
|
290
|
+
const originHeader = req.headers.origin;
|
|
291
|
+
const violation = violatesLoopbackGuard(loopbackGuard, req.headers.host, typeof originHeader === "string" ? originHeader : undefined);
|
|
292
|
+
if (violation !== null) {
|
|
293
|
+
writeJson(res, 403, { error: "forbidden", message: violation });
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
|
|
298
|
+
if (url.pathname !== "/mcp") {
|
|
299
|
+
writeJson(res, 404, { error: "not_found" });
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
const access = await authenticate(req, res);
|
|
303
|
+
if (access === null)
|
|
304
|
+
return;
|
|
305
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
306
|
+
const existing = typeof sessionId === "string" ? sessions.get(sessionId) : undefined;
|
|
307
|
+
if (existing) {
|
|
308
|
+
// A session id is routing state, not a credential: the request's own
|
|
309
|
+
// bearer must resolve to the identity the session was opened with.
|
|
310
|
+
if (existing.user !== access.user) {
|
|
311
|
+
writeJson(res, 401, {
|
|
312
|
+
error: "unauthorized",
|
|
313
|
+
message: "credential does not match the session's identity",
|
|
314
|
+
});
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const body = req.method === "POST" ? await readBody(req) : undefined;
|
|
318
|
+
await existing.transport.handleRequest(req, res, body);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
if (req.method !== "POST") {
|
|
322
|
+
writeJson(res, 400, { error: "bad_request", message: "unknown or missing session" });
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const body = await readBody(req);
|
|
326
|
+
if (!isInitializeRequest(body)) {
|
|
327
|
+
writeJson(res, 400, {
|
|
328
|
+
error: "bad_request",
|
|
329
|
+
message: "expected an initialize request to open a session",
|
|
330
|
+
});
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const transport = new StreamableHTTPServerTransport({
|
|
334
|
+
sessionIdGenerator: () => randomUUID(),
|
|
335
|
+
onsessioninitialized: (id) => {
|
|
336
|
+
sessions.set(id, { transport, user: access.user });
|
|
337
|
+
},
|
|
338
|
+
onsessionclosed: (id) => {
|
|
339
|
+
sessions.delete(id);
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
transport.onclose = () => {
|
|
343
|
+
const id = transport.sessionId;
|
|
344
|
+
if (id)
|
|
345
|
+
sessions.delete(id);
|
|
346
|
+
};
|
|
347
|
+
// One Server per session, bound to the session's identity — the whole
|
|
348
|
+
// point of Decision 2.
|
|
349
|
+
const server = createServer(vaultRoot, access, config.tools);
|
|
350
|
+
await server.connect(transport);
|
|
351
|
+
await transport.handleRequest(req, res, body);
|
|
352
|
+
}
|
|
353
|
+
return new Promise((resolveStart, rejectStart) => {
|
|
354
|
+
httpServer.once("error", rejectStart);
|
|
355
|
+
httpServer.listen(port, bind, () => {
|
|
356
|
+
httpServer.removeListener("error", rejectStart);
|
|
357
|
+
const address = httpServer.address();
|
|
358
|
+
const boundPort = typeof address === "object" && address !== null ? address.port : port;
|
|
359
|
+
if (isLoopbackBind(bind))
|
|
360
|
+
loopbackGuard = makeLoopbackGuard(boundPort);
|
|
361
|
+
resolveStart({
|
|
362
|
+
port: boundPort,
|
|
363
|
+
close: async () => {
|
|
364
|
+
// Sessions close concurrently — shutdown latency must not scale
|
|
365
|
+
// with the number of live clients.
|
|
366
|
+
await Promise.all([...sessions.values()].map((s) => s.transport.close().catch(() => { })));
|
|
367
|
+
sessions.clear();
|
|
368
|
+
await new Promise((r) => httpServer.close(() => r()));
|
|
369
|
+
},
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
// Startup gate for periodic storage sync (#6): when the config declares a
|
|
375
|
+
// sync cadence, the backend must be creatable BEFORE the server binds — a
|
|
376
|
+
// missing SDK or bad endpoint refuses at startup instead of leaving a
|
|
377
|
+
// healthy-looking server that silently never syncs. ok(null) when no
|
|
378
|
+
// periodic sync is configured.
|
|
379
|
+
export async function prepareStorageSync(config) {
|
|
380
|
+
const storage = config.storage;
|
|
381
|
+
if (storage?.syncIntervalMinutes === undefined)
|
|
382
|
+
return ok(null);
|
|
383
|
+
return createBackend(storage);
|
|
384
|
+
}
|
|
385
|
+
// The periodic push itself (#6): overlap-guarded (a slow push skips ticks
|
|
386
|
+
// rather than stacking), failures logged and never fatal — the backing is a
|
|
387
|
+
// durability channel, not a serving dependency. The timer is unref'd so it
|
|
388
|
+
// never keeps a dying process alive. Returns a stopper. `syncFn` is
|
|
389
|
+
// injectable for tests.
|
|
390
|
+
export function startPeriodicSync(vaultRoot, backend, intervalMinutes, syncFn = syncVault) {
|
|
391
|
+
let syncing = false;
|
|
392
|
+
const timer = setInterval(() => {
|
|
393
|
+
if (syncing)
|
|
394
|
+
return;
|
|
395
|
+
syncing = true;
|
|
396
|
+
void syncFn(vaultRoot, backend)
|
|
397
|
+
.then((r) => {
|
|
398
|
+
if (!r.ok) {
|
|
399
|
+
process.stderr.write(`daftari: warning: storage sync failed: ${r.error.message}\n`);
|
|
400
|
+
}
|
|
401
|
+
})
|
|
402
|
+
.finally(() => {
|
|
403
|
+
syncing = false;
|
|
404
|
+
});
|
|
405
|
+
}, intervalMinutes * 60 * 1000);
|
|
406
|
+
timer.unref();
|
|
407
|
+
return () => clearInterval(timer);
|
|
408
|
+
}
|
|
409
|
+
export async function runServe(argv) {
|
|
410
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
411
|
+
process.stdout.write(HELP);
|
|
412
|
+
return 0;
|
|
413
|
+
}
|
|
414
|
+
const vaultArg = parseFlag(argv, "vault");
|
|
415
|
+
if (!vaultArg) {
|
|
416
|
+
process.stderr.write("daftari serve: missing required --vault <path> argument\n");
|
|
417
|
+
return 2;
|
|
418
|
+
}
|
|
419
|
+
const vaultRoot = resolve(vaultArg);
|
|
420
|
+
if (!(await directoryExists(vaultRoot))) {
|
|
421
|
+
process.stderr.write(`daftari serve: vault directory not found: ${vaultRoot}\n`);
|
|
422
|
+
return 2;
|
|
423
|
+
}
|
|
424
|
+
const bind = parseFlag(argv, "bind") ?? DEFAULT_BIND;
|
|
425
|
+
const portRaw = parseFlag(argv, "port");
|
|
426
|
+
const port = portRaw === null ? DEFAULT_PORT : Number.parseInt(portRaw, 10);
|
|
427
|
+
if (Number.isNaN(port) || port < 0 || port > 65535) {
|
|
428
|
+
process.stderr.write(`daftari serve: invalid --port '${portRaw}'\n`);
|
|
429
|
+
return 2;
|
|
430
|
+
}
|
|
431
|
+
const config = loadConfig(vaultRoot);
|
|
432
|
+
if (!config.ok) {
|
|
433
|
+
process.stderr.write(`daftari serve: ${config.error.message}\n`);
|
|
434
|
+
return 2;
|
|
435
|
+
}
|
|
436
|
+
const gate = validateServeStartup(config.value, bind, process.env);
|
|
437
|
+
if (!gate.ok) {
|
|
438
|
+
process.stderr.write(`daftari serve: ${gate.error}\n`);
|
|
439
|
+
return 2;
|
|
440
|
+
}
|
|
441
|
+
// Storage backing for periodic sync (#6): created and validated BEFORE the
|
|
442
|
+
// lock and the listener. A config-declared capability that cannot run must
|
|
443
|
+
// refuse at startup — returning an exit code after the listener is up
|
|
444
|
+
// would leave a healthy-looking server that silently never syncs.
|
|
445
|
+
const syncBackend = await prepareStorageSync(config.value);
|
|
446
|
+
if (!syncBackend.ok) {
|
|
447
|
+
process.stderr.write(`daftari serve: ${syncBackend.error.message}\n`);
|
|
448
|
+
return 2;
|
|
449
|
+
}
|
|
450
|
+
const lock = await acquireLock(vaultRoot, SERVER_VERSION, {
|
|
451
|
+
mode: "serve",
|
|
452
|
+
bind: `${bind}:${port}`,
|
|
453
|
+
takeover: argv.includes("--takeover"),
|
|
454
|
+
});
|
|
455
|
+
if (!lock.ok) {
|
|
456
|
+
process.stderr.write(`daftari serve: ${lock.error.message}\n`);
|
|
457
|
+
return 2;
|
|
458
|
+
}
|
|
459
|
+
// Install immediately after the lock lands (the stdio path's guarantee):
|
|
460
|
+
// a failure between here and the listener opening must still release the
|
|
461
|
+
// lock on exit. `handle` is assigned once the listener is up.
|
|
462
|
+
let handle = null;
|
|
463
|
+
installShutdownHandlers(vaultRoot, () => {
|
|
464
|
+
if (handle)
|
|
465
|
+
void handle.close();
|
|
466
|
+
});
|
|
467
|
+
try {
|
|
468
|
+
setProvider(config.value.embeddingProvider);
|
|
469
|
+
}
|
|
470
|
+
catch (e) {
|
|
471
|
+
process.stderr.write(`daftari serve: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
472
|
+
return 3;
|
|
473
|
+
}
|
|
474
|
+
// Startup warnings mirror stdio's: unknown tool names in the tools block.
|
|
475
|
+
for (const name of resolveToolExposure(config.value.tools).unknown) {
|
|
476
|
+
process.stderr.write(`daftari: warning: tools.include/exclude names unknown tool '${name}' — ignored\n`);
|
|
477
|
+
}
|
|
478
|
+
try {
|
|
479
|
+
handle = await startHttpServer(vaultRoot, config.value, gate.tokens, bind, port);
|
|
480
|
+
}
|
|
481
|
+
catch (e) {
|
|
482
|
+
process.stderr.write(`daftari serve: failed to bind ${bind}:${port}: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
483
|
+
return 3;
|
|
484
|
+
}
|
|
485
|
+
const authParts = [
|
|
486
|
+
...(gate.tokens.length > 0 ? [`${gate.tokens.length} token(s)`] : []),
|
|
487
|
+
...(config.value.server.oauth !== undefined ? ["oauth"] : []),
|
|
488
|
+
];
|
|
489
|
+
process.stderr.write(`daftari: serving vault at ${vaultRoot} — http://${bind}:${handle.port}/mcp ` +
|
|
490
|
+
`(${authParts.length > 0 ? authParts.join(" + ") : "no auth: guest-only"})\n`);
|
|
491
|
+
await startVaultServices(vaultRoot, {
|
|
492
|
+
warmEmbeddings: config.value.warmEmbeddings,
|
|
493
|
+
watch: config.value.watch,
|
|
494
|
+
});
|
|
495
|
+
// Periodic push to the storage backing (#6). The backend was created and
|
|
496
|
+
// validated BEFORE the listener opened (prepareStorageSync); from here on
|
|
497
|
+
// sync failures are logged, never fatal — the backing is a durability
|
|
498
|
+
// channel, not a serving dependency. Overlap-guarded: a slow push skips
|
|
499
|
+
// ticks rather than stacking.
|
|
500
|
+
const intervalMinutes = config.value.storage?.syncIntervalMinutes;
|
|
501
|
+
if (syncBackend.value !== null && intervalMinutes !== undefined) {
|
|
502
|
+
startPeriodicSync(vaultRoot, syncBackend.value, intervalMinutes);
|
|
503
|
+
process.stderr.write(`daftari: syncing to ${syncBackend.value.id} every ${intervalMinutes}m\n`);
|
|
504
|
+
}
|
|
505
|
+
return 0;
|
|
506
|
+
}
|
|
507
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serve/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
2
|
import { type AccessContext } from "./access/rbac.js";
|
|
3
|
+
import type { ToolsConfig } from "./utils/config.js";
|
|
3
4
|
export declare const SERVER_NAME = "daftari";
|
|
4
5
|
export declare const SERVER_VERSION: string;
|
|
5
|
-
export declare function
|
|
6
|
+
export declare function registeredToolNames(): string[];
|
|
7
|
+
export declare const CORE_TOOLS: readonly string[];
|
|
8
|
+
export declare const STANDARD_TOOLS: readonly string[];
|
|
9
|
+
export interface ToolExposure {
|
|
10
|
+
exposed: Set<string>;
|
|
11
|
+
unknown: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare function resolveToolExposure(tools: ToolsConfig): ToolExposure;
|
|
14
|
+
export declare function createServer(vaultRoot: string, access?: AccessContext, toolsConfig?: ToolsConfig): Server;
|
|
6
15
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,EAAE,KAAK,aAAa,EAAe,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,EAAE,KAAK,aAAa,EAAe,MAAM,kBAAkB,CAAC;AAcnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,WAAW,YAAY,CAAC;AAQrC,eAAO,MAAM,cAAc,QAAmB,CAAC;AAoB/C,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AAWD,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAOvC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAc3C,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAIrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAKD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAoBpE;AAQD,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,aAA6B,EACrC,WAAW,CAAC,EAAE,WAAW,GACxB,MAAM,CAwDR"}
|