@agentcairn/mcp-server 0.0.0-stage → 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.
Files changed (58) hide show
  1. package/README.md +23 -2
  2. package/dist/authn.d.ts +38 -0
  3. package/dist/authn.js +86 -0
  4. package/dist/authn.js.map +1 -0
  5. package/dist/bin.d.ts +2 -0
  6. package/dist/bin.js +25 -0
  7. package/dist/bin.js.map +1 -0
  8. package/dist/context.d.ts +49 -0
  9. package/dist/context.js +79 -0
  10. package/dist/context.js.map +1 -0
  11. package/dist/dashboard.d.ts +29 -0
  12. package/dist/dashboard.js +365 -0
  13. package/dist/dashboard.js.map +1 -0
  14. package/dist/events.d.ts +120 -0
  15. package/dist/events.js +161 -0
  16. package/dist/events.js.map +1 -0
  17. package/dist/http.d.ts +35 -0
  18. package/dist/http.js +348 -0
  19. package/dist/http.js.map +1 -0
  20. package/dist/index.d.ts +7 -0
  21. package/dist/index.js +8 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/security.d.ts +49 -0
  24. package/dist/security.js +143 -0
  25. package/dist/security.js.map +1 -0
  26. package/dist/serve.d.ts +2 -0
  27. package/dist/serve.js +60 -0
  28. package/dist/serve.js.map +1 -0
  29. package/dist/server.d.ts +10 -0
  30. package/dist/server.js +14 -0
  31. package/dist/server.js.map +1 -0
  32. package/dist/tools.d.ts +8 -0
  33. package/dist/tools.js +199 -0
  34. package/dist/tools.js.map +1 -0
  35. package/dist/util.d.ts +13 -0
  36. package/dist/util.js +49 -0
  37. package/dist/util.js.map +1 -0
  38. package/package.json +55 -4
  39. package/ui/css/app.css +361 -0
  40. package/ui/favicon.svg +1 -0
  41. package/ui/index.html +17 -0
  42. package/ui/js/api.js +37 -0
  43. package/ui/js/app.js +190 -0
  44. package/ui/js/charts.js +133 -0
  45. package/ui/js/dom.js +247 -0
  46. package/ui/js/drawer.js +39 -0
  47. package/ui/js/json.js +37 -0
  48. package/ui/js/store.js +77 -0
  49. package/ui/js/views/access.js +129 -0
  50. package/ui/js/views/auth.js +102 -0
  51. package/ui/js/views/eventDrawer.js +106 -0
  52. package/ui/js/views/graph.js +344 -0
  53. package/ui/js/views/live.js +203 -0
  54. package/ui/js/views/memoryDrawer.js +37 -0
  55. package/ui/js/views/project.js +94 -0
  56. package/ui/js/views/projects.js +77 -0
  57. package/ui/js/views/query.js +107 -0
  58. package/ui/js/views/system.js +73 -0
package/dist/events.js ADDED
@@ -0,0 +1,161 @@
1
+ /**
2
+ * In-memory flight recorder for everything agents send the server. Nothing
3
+ * here is persisted: it holds the last `capacity` requests plus rolling
4
+ * aggregates, which is what the dashboard's live views are drawn from.
5
+ */
6
+ const MINUTE = 60_000;
7
+ const ACTIVE_MS = 5 * MINUTE;
8
+ const FORGET_MS = 24 * 60 * MINUTE;
9
+ const percentile = (sorted, p) => sorted.length === 0 ? 0 : sorted[Math.min(sorted.length - 1, Math.floor((p / 100) * sorted.length))];
10
+ export class EventLog {
11
+ capacity;
12
+ startedAt;
13
+ clock;
14
+ ring = [];
15
+ nextId = 1;
16
+ subscribers = new Set();
17
+ clients = new Map();
18
+ projects = new Map();
19
+ minutes = new Map();
20
+ totals = { requests: 0, errors: 0, authFailures: 0, tokensOut: 0, bytesIn: 0, bytesOut: 0 };
21
+ viewers = 0;
22
+ constructor(capacity = 2000, startedAt = new Date(), clock = Date.now) {
23
+ this.capacity = capacity;
24
+ this.startedAt = startedAt;
25
+ this.clock = clock;
26
+ }
27
+ add(input) {
28
+ const now = this.clock();
29
+ const event = { ...input, id: this.nextId++, ts: new Date(now).toISOString() };
30
+ this.ring.push(event);
31
+ if (this.ring.length > this.capacity)
32
+ this.ring.splice(0, this.ring.length - this.capacity);
33
+ this.totals.requests++;
34
+ if (!event.ok)
35
+ this.totals.errors++;
36
+ if (event.source === 'auth')
37
+ this.totals.authFailures++;
38
+ this.totals.tokensOut += event.tokensOut;
39
+ this.totals.bytesIn += event.bytesIn;
40
+ this.totals.bytesOut += event.bytesOut;
41
+ const minute = Math.floor(now / MINUTE) * MINUTE;
42
+ const bucket = this.minutes.get(minute) ?? { t: new Date(minute).toISOString(), requests: 0, errors: 0, tokensOut: 0 };
43
+ bucket.requests++;
44
+ if (!event.ok)
45
+ bucket.errors++;
46
+ bucket.tokensOut += event.tokensOut;
47
+ this.minutes.set(minute, bucket);
48
+ for (const key of this.minutes.keys())
49
+ if (key < now - 6 * 60 * MINUTE)
50
+ this.minutes.delete(key);
51
+ if (event.source !== 'auth')
52
+ this.track(event, now);
53
+ const summary = summarize(event);
54
+ for (const fn of this.subscribers) {
55
+ try {
56
+ fn(summary);
57
+ }
58
+ catch {
59
+ // a broken subscriber must not break recording
60
+ }
61
+ }
62
+ return event;
63
+ }
64
+ track(event, now) {
65
+ const key = `${event.client.token ?? '-'}|${event.client.ip ?? '-'}|${event.client.agent ?? '-'}`;
66
+ const c = this.clients.get(key) ??
67
+ { key, token: event.client.token, ip: event.client.ip, agent: event.client.agent, firstSeen: event.ts, lastSeen: event.ts, requests: 0, errors: 0, active: false };
68
+ c.requests++;
69
+ if (!event.ok)
70
+ c.errors++;
71
+ c.lastSeen = event.ts;
72
+ if (event.tool)
73
+ c.lastTool = event.tool;
74
+ if (event.project)
75
+ c.lastProject = event.project;
76
+ this.clients.set(key, c);
77
+ for (const [k, v] of this.clients)
78
+ if (Date.parse(v.lastSeen) < now - FORGET_MS)
79
+ this.clients.delete(k);
80
+ if (event.project) {
81
+ const p = this.projects.get(event.project) ?? { project: event.project, requests: 0, lastSeen: event.ts };
82
+ p.requests++;
83
+ p.lastSeen = event.ts;
84
+ this.projects.set(event.project, p);
85
+ }
86
+ }
87
+ subscribe(fn) {
88
+ this.subscribers.add(fn);
89
+ return () => this.subscribers.delete(fn);
90
+ }
91
+ get(id) {
92
+ return this.ring.find(e => e.id === id);
93
+ }
94
+ recent(filter = {}) {
95
+ const limit = Math.min(Math.max(filter.limit ?? 100, 1), 500);
96
+ const out = [];
97
+ for (let i = this.ring.length - 1; i >= 0 && out.length < limit; i--) {
98
+ const e = this.ring[i];
99
+ if (filter.before !== undefined && e.id >= filter.before)
100
+ continue;
101
+ if (filter.tool && e.tool !== filter.tool && e.method !== filter.tool)
102
+ continue;
103
+ if (filter.project && e.project !== filter.project)
104
+ continue;
105
+ if (filter.client && e.client.token !== filter.client && e.client.ip !== filter.client && e.client.agent !== filter.client)
106
+ continue;
107
+ if (filter.ok !== undefined && e.ok !== filter.ok)
108
+ continue;
109
+ if (filter.source && e.source !== filter.source)
110
+ continue;
111
+ out.push(summarize(e));
112
+ }
113
+ return out;
114
+ }
115
+ stats() {
116
+ const now = this.clock();
117
+ const perMinute = [];
118
+ const current = Math.floor(now / MINUTE) * MINUTE;
119
+ for (let i = 59; i >= 0; i--) {
120
+ const t = current - i * MINUTE;
121
+ perMinute.push(this.minutes.get(t) ?? { t: new Date(t).toISOString(), requests: 0, errors: 0, tokensOut: 0 });
122
+ }
123
+ const byTool = new Map();
124
+ for (const e of this.ring) {
125
+ // protocol chatter (initialize, tools/list…) is in the feed but is not a tool
126
+ if (e.source === 'auth' || (e.source === 'mcp' && !e.tool))
127
+ continue;
128
+ const name = e.tool ?? e.method;
129
+ byTool.set(name, [...(byTool.get(name) ?? []), e]);
130
+ }
131
+ const tools = [...byTool].map(([name, events]) => {
132
+ const durations = events.map(e => e.durationMs).sort((a, b) => a - b);
133
+ return {
134
+ name,
135
+ count: events.length,
136
+ errors: events.filter(e => !e.ok).length,
137
+ p50Ms: Math.round(percentile(durations, 50)),
138
+ p95Ms: Math.round(percentile(durations, 95)),
139
+ avgTokensOut: Math.round(events.reduce((a, e) => a + e.tokensOut, 0) / events.length),
140
+ };
141
+ });
142
+ tools.sort((a, b) => b.count - a.count);
143
+ return {
144
+ startedAt: this.startedAt.toISOString(),
145
+ uptimeSeconds: Math.round((now - this.startedAt.getTime()) / 1000),
146
+ totals: { ...this.totals },
147
+ perMinute,
148
+ tools,
149
+ clients: [...this.clients.values()]
150
+ .map(c => ({ ...c, active: now - Date.parse(c.lastSeen) < ACTIVE_MS }))
151
+ .sort((a, b) => b.lastSeen.localeCompare(a.lastSeen)),
152
+ projects: [...this.projects.values()].sort((a, b) => b.lastSeen.localeCompare(a.lastSeen)),
153
+ viewers: this.viewers,
154
+ };
155
+ }
156
+ }
157
+ export function summarize(e) {
158
+ const { request, response, ...rest } = e;
159
+ return { ...rest, hasPayload: request !== undefined || response !== undefined };
160
+ }
161
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,35 @@
1
+ import { type Server } from 'node:http';
2
+ import { type Brain } from '@agentcairn/core';
3
+ import { Authenticator } from './authn.js';
4
+ import { EventLog } from './events.js';
5
+ import { SessionStore, SetupGate } from './security.js';
6
+ export declare const PROJECT_HEADER = "x-cairn-project";
7
+ export declare const REMOTE_HEADER = "x-cairn-remote";
8
+ export interface HttpOptions {
9
+ /** Static bearer token (CAIRN_TOKEN). Tokens made in the dashboard work too. */
10
+ token?: string;
11
+ /** Run without any authentication. Trusted networks only. */
12
+ noAuth?: boolean;
13
+ maxBodyBytes?: number;
14
+ log?: (message: string) => void;
15
+ /** `full` keeps request and response payloads for the dashboard; `meta` keeps only the summary. */
16
+ capture?: 'full' | 'meta';
17
+ /** How many recent requests the flight recorder holds. */
18
+ eventCapacity?: number;
19
+ /** Believe X-Forwarded-For (only behind a proxy you control). */
20
+ trustProxy?: boolean;
21
+ /** Mark session cookies Secure (when served over HTTPS). */
22
+ secureCookies?: boolean;
23
+ /** Serve the dashboard (default true). */
24
+ dashboard?: boolean;
25
+ port?: number;
26
+ }
27
+ export interface BrainHttp {
28
+ server: Server;
29
+ events: EventLog;
30
+ setup: SetupGate;
31
+ sessions: SessionStore;
32
+ auth: Authenticator;
33
+ }
34
+ export declare function createBrainHttp(brain: Brain, options?: HttpOptions): BrainHttp;
35
+ export declare function createHttpServer(brain: Brain, options?: HttpOptions): Server;
package/dist/http.js ADDED
@@ -0,0 +1,348 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import { createServer } from 'node:http';
3
+ import { MemoryValidationError, ProjectMissingError, ProjectNotFoundError, RemoteConflictError, UnresolvedProjectError, attachRemote, buildBriefing, checkConnection, countActiveByKind, estimateTokens, hasDefaultCredentials, listStaleInputs, loadConfig, normalizeRemoteHint, registerProject, remoteHash, schemaVersion, SupersedeError, } from '@agentcairn/core';
4
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
5
+ import { Authenticator, authFailureMessage } from './authn.js';
6
+ import { BrainContext } from './context.js';
7
+ import { createDashboard } from './dashboard.js';
8
+ import { EventLog } from './events.js';
9
+ import { SessionStore, SetupGate } from './security.js';
10
+ import { createBrainServer } from './server.js';
11
+ import { HttpError, asRecord, clientIp, header, readJson, send } from './util.js';
12
+ export const PROJECT_HEADER = 'x-cairn-project';
13
+ export const REMOTE_HEADER = 'x-cairn-remote';
14
+ const SERVER_VERSION = '0.1.0';
15
+ const PAYLOAD_LIMIT = 16_384;
16
+ const CAPTURE_PARSE_LIMIT = 512 * 1024;
17
+ function toHttpError(error) {
18
+ if (error instanceof HttpError)
19
+ return error;
20
+ if (error instanceof ProjectNotFoundError)
21
+ return new HttpError(404, 'project_not_found', error.message, { projectId: error.projectId });
22
+ if (error instanceof ProjectMissingError)
23
+ return new HttpError(404, 'project_not_found', error.message, { projectId: error.projectId });
24
+ if (error instanceof RemoteConflictError) {
25
+ return new HttpError(409, 'remote_conflict', error.message, { ownerProjectId: error.ownerProjectId });
26
+ }
27
+ if (error instanceof UnresolvedProjectError)
28
+ return new HttpError(400, 'unresolved_project', error.message);
29
+ if (error instanceof MemoryValidationError || error instanceof SupersedeError) {
30
+ return new HttpError(400, 'invalid', error.message);
31
+ }
32
+ const e = error;
33
+ if (e.code === 'ServiceUnavailable' || e.code === 'SessionExpired' || e.code === 'Neo.ClientError.Security.Unauthorized') {
34
+ return new HttpError(503, 'database_unavailable', 'The server cannot reach Neo4j.');
35
+ }
36
+ if (e.message?.startsWith('Invalid project id'))
37
+ return new HttpError(400, 'invalid', e.message);
38
+ return new HttpError(500, 'internal', 'Unexpected server error.');
39
+ }
40
+ /** Keeps payloads small enough to hold thousands of them in memory. */
41
+ function trimPayload(value) {
42
+ if (value === undefined)
43
+ return undefined;
44
+ const text = JSON.stringify(value);
45
+ if (text === undefined || text.length <= PAYLOAD_LIMIT)
46
+ return value;
47
+ return { _truncated: true, originalChars: text.length, preview: text.slice(0, PAYLOAD_LIMIT) };
48
+ }
49
+ /** Records the response as it is written, without changing it. */
50
+ function tapResponse(res) {
51
+ const chunks = [];
52
+ let kept = 0;
53
+ let total = 0;
54
+ const take = (chunk) => {
55
+ if (chunk === undefined || chunk === null || typeof chunk === 'function')
56
+ return;
57
+ const buf = Buffer.isBuffer(chunk) ? chunk : chunk instanceof Uint8Array ? Buffer.from(chunk) : Buffer.from(String(chunk));
58
+ total += buf.length;
59
+ if (kept + buf.length <= CAPTURE_PARSE_LIMIT) {
60
+ chunks.push(buf);
61
+ kept += buf.length;
62
+ }
63
+ };
64
+ const write = res.write.bind(res);
65
+ const end = res.end.bind(res);
66
+ res.write = (chunk, ...rest) => {
67
+ take(chunk);
68
+ return write(chunk, ...rest);
69
+ };
70
+ res.end = (chunk, ...rest) => {
71
+ take(chunk);
72
+ return end(chunk, ...rest);
73
+ };
74
+ return { bytes: () => total, text: () => (total === kept ? Buffer.concat(chunks).toString('utf8') : undefined) };
75
+ }
76
+ /** A response body is plain JSON, or SSE framing (`event: message` / `data: {...}`) around it. */
77
+ function parseResponse(raw) {
78
+ if (!raw)
79
+ return undefined;
80
+ try {
81
+ return JSON.parse(raw);
82
+ }
83
+ catch {
84
+ for (const line of raw.split('\n')) {
85
+ if (!line.startsWith('data:'))
86
+ continue;
87
+ try {
88
+ return JSON.parse(line.slice(5).trim());
89
+ }
90
+ catch {
91
+ // keep looking
92
+ }
93
+ }
94
+ return undefined;
95
+ }
96
+ }
97
+ const textOf = (content) => Array.isArray(content)
98
+ ? content.map(c => c.text).filter((t) => typeof t === 'string').join('\n')
99
+ : undefined;
100
+ const SHORT_ID = /#([0-9a-f]{8})\b/g;
101
+ const refsIn = (text) => [...new Set([...(text ?? '').matchAll(SHORT_ID)].map(m => m[1]))].slice(0, 60);
102
+ export function createBrainHttp(brain, options = {}) {
103
+ const maxBody = options.maxBodyBytes ?? 1_000_000;
104
+ const log = options.log ?? (() => undefined);
105
+ const capture = options.capture ?? 'full';
106
+ const trustProxy = options.trustProxy ?? false;
107
+ const events = new EventLog(options.eventCapacity ?? 2000);
108
+ const sessions = new SessionStore();
109
+ const setup = new SetupGate();
110
+ const auth = new Authenticator(brain, { envToken: options.token, noAuth: options.noAuth }, Date.now, log);
111
+ const dashboard = options.dashboard === false
112
+ ? undefined
113
+ : createDashboard({
114
+ brain,
115
+ events,
116
+ auth,
117
+ sessions,
118
+ setup,
119
+ version: SERVER_VERSION,
120
+ port: options.port ?? 8787,
121
+ uiDir: fileURLToPath(new URL('../ui', import.meta.url)),
122
+ trustProxy,
123
+ secureCookies: options.secureCookies ?? false,
124
+ maxBodyBytes: maxBody,
125
+ capture,
126
+ authMode: { envToken: Boolean(options.token), noAuth: Boolean(options.noAuth) },
127
+ log,
128
+ });
129
+ const hintOf = (req) => ({ projectId: header(req, PROJECT_HEADER), remote: header(req, REMOTE_HEADER) });
130
+ const agentOf = (req) => header(req, 'user-agent')?.split(/[\s/]/)[0];
131
+ /** The project each in-flight request resolved to, read when its event is recorded. */
132
+ const resolved = new WeakMap();
133
+ const contextFor = (req) => new BrainContext(brain, { hint: hintOf(req) }, () => agentOf(req), id => resolved.set(req, id));
134
+ async function handleMcp(req, res, body) {
135
+ if (req.method !== 'POST') {
136
+ res.setHeader('allow', 'POST');
137
+ return send(res, 405, {
138
+ jsonrpc: '2.0',
139
+ error: { code: -32000, message: 'Method not allowed: this server is stateless, use POST.' },
140
+ id: null,
141
+ });
142
+ }
143
+ const server = createBrainServer(brain, { hint: hintOf(req) }, { agent: agentOf(req), onProject: id => resolved.set(req, id) });
144
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true });
145
+ res.on('close', () => {
146
+ void transport.close();
147
+ void server.close();
148
+ });
149
+ await server.connect(transport);
150
+ await transport.handleRequest(req, res, body);
151
+ }
152
+ async function handleApi(req, res, path, rawBody) {
153
+ const ctx = contextFor(req);
154
+ const method = req.method ?? 'GET';
155
+ const body = asRecord(rawBody);
156
+ if (path === '/api/project' && method === 'GET') {
157
+ await ctx.ready();
158
+ const project = await ctx.project({ write: false });
159
+ const counts = await countActiveByKind(brain, project.projectId);
160
+ const info = await checkConnection(brain);
161
+ return send(res, 200, {
162
+ ...project,
163
+ counts: Object.fromEntries(counts),
164
+ total: [...counts.values()].reduce((a, b) => a + b, 0),
165
+ schemaVersion: await schemaVersion(brain),
166
+ neo4j: info.agent,
167
+ defaultCredentials: hasDefaultCredentials(loadConfig()),
168
+ });
169
+ }
170
+ if (path === '/api/init' && method === 'POST') {
171
+ await ctx.ready();
172
+ const remote = typeof body.remote === 'string' ? normalizeRemoteHint(body.remote) : null;
173
+ if (typeof body.remote === 'string' && !remote)
174
+ throw new HttpError(400, 'invalid', 'remote is not a usable git remote.');
175
+ const result = await registerProject(brain, { projectId: typeof body.projectId === 'string' ? body.projectId : undefined, remoteHash: remote ? remoteHash(remote) : null }, { allowCreate: body.allowCreate === true, forceRemote: body.forceRemote === true });
176
+ return send(res, 200, result);
177
+ }
178
+ if (path === '/api/stale-inputs' && method === 'GET') {
179
+ const project = await ctx.project({ write: false });
180
+ return send(res, 200, { inputs: await listStaleInputs(brain, project.projectId) });
181
+ }
182
+ if (path === '/api/briefing' && method === 'POST') {
183
+ const project = await ctx.project({ write: false });
184
+ const staleness = new Map();
185
+ for (const item of Array.isArray(body.stale) ? body.stale : []) {
186
+ const s = asRecord(item);
187
+ if (typeof s.id === 'string') {
188
+ const changed = Array.isArray(s.changedPaths) ? s.changedPaths.filter((p) => typeof p === 'string') : [];
189
+ staleness.set(s.id, { status: 'stale', changedPaths: changed });
190
+ }
191
+ }
192
+ const maxTokens = typeof body.maxTokens === 'number' ? body.maxTokens : undefined;
193
+ return send(res, 200, await buildBriefing(brain, project.projectId, { maxTokens, staleness }));
194
+ }
195
+ if (path === '/api/remote' && method === 'POST') {
196
+ const remote = typeof body.remote === 'string' ? normalizeRemoteHint(body.remote) : null;
197
+ if (!remote)
198
+ throw new HttpError(400, 'invalid', 'remote is not a usable git remote.');
199
+ const project = await ctx.project({ write: false });
200
+ if (project.isNew)
201
+ throw new ProjectNotFoundError(project.projectId);
202
+ await attachRemote(brain, project.projectId, remoteHash(remote), { force: body.force === true });
203
+ return send(res, 200, { projectId: project.projectId, remote });
204
+ }
205
+ throw new HttpError(404, 'not_found', `No such endpoint: ${method} ${path}`);
206
+ }
207
+ /** Builds the dashboard's record of one finished request. */
208
+ function record(req, res, source, path, body, tap, startedAt, tokenName) {
209
+ const rawResponse = tap.text();
210
+ const parsed = parseResponse(rawResponse);
211
+ let method = `${req.method} ${path}`;
212
+ let tool;
213
+ let ok = res.statusCode < 400;
214
+ let error;
215
+ let responseText;
216
+ let request = body;
217
+ let response = parsed;
218
+ if (source === 'mcp') {
219
+ const rpc = asRecord(Array.isArray(body) ? body[0] : body);
220
+ const out = asRecord(Array.isArray(parsed) ? parsed[0] : parsed);
221
+ const params = asRecord(rpc.params);
222
+ method = typeof rpc.method === 'string' ? rpc.method : 'mcp';
223
+ if (method === 'tools/call' && typeof params.name === 'string')
224
+ tool = params.name;
225
+ const result = asRecord(out.result);
226
+ const failure = asRecord(out.error);
227
+ responseText = textOf(result.content);
228
+ if (typeof failure.message === 'string') {
229
+ ok = false;
230
+ error = failure.message;
231
+ }
232
+ else if (result.isError === true) {
233
+ ok = false;
234
+ error = responseText;
235
+ }
236
+ request = tool ? { tool, arguments: params.arguments } : rpc;
237
+ response = tool ? { text: responseText, isError: result.isError === true } : result;
238
+ }
239
+ else {
240
+ const out = asRecord(parsed);
241
+ responseText = typeof out.text === 'string' ? out.text : undefined;
242
+ if (!ok)
243
+ error = typeof out.message === 'string' ? out.message : undefined;
244
+ }
245
+ const project = resolved.get(req) ?? header(req, PROJECT_HEADER) ?? (header(req, REMOTE_HEADER) ? `remote:${header(req, REMOTE_HEADER)}` : undefined);
246
+ const bytesOut = tap.bytes();
247
+ const event = {
248
+ source,
249
+ method,
250
+ tool,
251
+ project,
252
+ client: { token: tokenName, ip: clientIp(req, trustProxy), agent: agentOf(req), userAgent: header(req, 'user-agent') },
253
+ durationMs: Math.round(performance.now() - startedAt),
254
+ ok,
255
+ httpStatus: res.statusCode,
256
+ bytesIn: Number(header(req, 'content-length')) || 0,
257
+ bytesOut,
258
+ tokensOut: estimateTokens(responseText ?? rawResponse ?? ''),
259
+ memoryRefs: refsIn(responseText ?? rawResponse),
260
+ error: error?.slice(0, 500),
261
+ request: capture === 'full' ? trimPayload(request) : undefined,
262
+ response: capture === 'full' ? trimPayload(response) : undefined,
263
+ };
264
+ events.add(event);
265
+ }
266
+ const server = createServer((req, res) => {
267
+ void (async () => {
268
+ const startedAt = performance.now();
269
+ let recorded = false;
270
+ try {
271
+ const path = new URL(req.url ?? '/', 'http://localhost').pathname;
272
+ if (path === '/healthz') {
273
+ try {
274
+ await Promise.race([
275
+ brain.driver.verifyConnectivity(),
276
+ new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 3000)),
277
+ ]);
278
+ return send(res, 200, { status: 'ok' });
279
+ }
280
+ catch {
281
+ return send(res, 503, { status: 'database_unavailable' });
282
+ }
283
+ }
284
+ if (dashboard && (await dashboard(req, res, path)))
285
+ return;
286
+ const isMcp = path === '/mcp';
287
+ if (!isMcp && !path.startsWith('/api/'))
288
+ throw new HttpError(404, 'not_found', 'Not found.');
289
+ const authResult = await auth.check(req);
290
+ if (!authResult.ok) {
291
+ const message = authFailureMessage(authResult.reason);
292
+ res.setHeader('www-authenticate', 'Bearer');
293
+ send(res, 401, { error: authResult.reason === 'no_tokens' ? 'no_tokens' : 'unauthorized', message });
294
+ events.add({
295
+ source: 'auth',
296
+ method: `${req.method} ${path}`,
297
+ client: { ip: clientIp(req, trustProxy), agent: agentOf(req), userAgent: header(req, 'user-agent') },
298
+ durationMs: Math.round(performance.now() - startedAt),
299
+ ok: false,
300
+ httpStatus: 401,
301
+ bytesIn: 0,
302
+ bytesOut: 0,
303
+ tokensOut: 0,
304
+ memoryRefs: [],
305
+ error: message,
306
+ });
307
+ return;
308
+ }
309
+ const tap = tapResponse(res);
310
+ let body;
311
+ res.on('finish', () => {
312
+ if (recorded)
313
+ return;
314
+ recorded = true;
315
+ // a client probing GET/DELETE /mcp for a stream is protocol chatter, not a request
316
+ if (isMcp && req.method !== 'POST')
317
+ return;
318
+ try {
319
+ record(req, res, isMcp ? 'mcp' : 'api', path, body, tap, startedAt, authResult.name);
320
+ }
321
+ catch (error) {
322
+ log(`could not record event: ${error.message}`);
323
+ }
324
+ });
325
+ if (req.method === 'POST')
326
+ body = await readJson(req, maxBody);
327
+ if (isMcp)
328
+ await handleMcp(req, res, body);
329
+ else
330
+ await handleApi(req, res, path, body);
331
+ }
332
+ catch (error) {
333
+ const e = toHttpError(error);
334
+ if (e.status >= 500)
335
+ log(`error: ${error instanceof Error ? (error.stack ?? error.message) : String(error)}`);
336
+ if (!res.headersSent)
337
+ send(res, e.status, { error: e.code, message: e.message, ...e.extra });
338
+ else
339
+ res.end();
340
+ }
341
+ })();
342
+ });
343
+ return { server, events, setup, sessions, auth };
344
+ }
345
+ export function createHttpServer(brain, options = {}) {
346
+ return createBrainHttp(brain, options).server;
347
+ }
348
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { Authenticator, type AuthResult } from './authn.js';
2
+ export { BrainContext, type Scope } from './context.js';
3
+ export { EventLog, type BrainEvent, type EventSummary, type Stats } from './events.js';
4
+ export { PROJECT_HEADER, REMOTE_HEADER, createBrainHttp, createHttpServer, type BrainHttp, type HttpOptions } from './http.js';
5
+ export { SessionStore, SetupGate, generateSetupCode } from './security.js';
6
+ export { SERVER_NAME, SERVER_VERSION, createBrainServer } from './server.js';
7
+ export { SERVER_INSTRUCTIONS, describeError, formatMemory, registerTools } from './tools.js';
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export { Authenticator } from './authn.js';
2
+ export { BrainContext } from './context.js';
3
+ export { EventLog } from './events.js';
4
+ export { PROJECT_HEADER, REMOTE_HEADER, createBrainHttp, createHttpServer } from './http.js';
5
+ export { SessionStore, SetupGate, generateSetupCode } from './security.js';
6
+ export { SERVER_NAME, SERVER_VERSION, createBrainServer } from './server.js';
7
+ export { SERVER_INSTRUCTIONS, describeError, formatMemory, registerTools } from './tools.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAc,MAAM,cAAc,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAkD,MAAM,aAAa,CAAA;AACtF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAoC,MAAM,WAAW,CAAA;AAC9H,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC5E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA"}