@nextclaw/nextclaw-ncp-runtime-adapter-hermes-http 0.1.1

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.
@@ -0,0 +1,458 @@
1
+ import { NcpAssistantTextStreamNormalizer, NcpEventType } from "@nextclaw/ncp";
2
+ //#region src/hermes-http-adapter-message.utils.ts
3
+ const HERMES_INLINE_TOOL_TRACE_PATTERNS = [{
4
+ icon: "🔎",
5
+ toolName: "search_files",
6
+ buildArgs: (rawArgs) => JSON.stringify({ pattern: rawArgs })
7
+ }, {
8
+ icon: "💻",
9
+ toolName: "terminal",
10
+ buildArgs: (rawArgs) => JSON.stringify({ command: rawArgs })
11
+ }];
12
+ function readMetadataString(metadata, key) {
13
+ const value = metadata?.[key];
14
+ if (typeof value !== "string") return;
15
+ const trimmed = value.trim();
16
+ return trimmed.length > 0 ? trimmed : void 0;
17
+ }
18
+ function readStringRecord(value) {
19
+ if (!value || typeof value !== "object" || Array.isArray(value)) return;
20
+ const out = {};
21
+ for (const [entryKey, entryValue] of Object.entries(value)) {
22
+ if (typeof entryValue !== "string") continue;
23
+ const normalized = entryValue.trim();
24
+ if (!normalized) continue;
25
+ out[entryKey] = normalized;
26
+ }
27
+ return Object.keys(out).length > 0 ? out : void 0;
28
+ }
29
+ const NARP_API_MODE_HEADER = "x-nextclaw-narp-api-mode";
30
+ function readHermesProviderRoute(envelope) {
31
+ const route = envelope.providerRoute;
32
+ if (!route || typeof route !== "object" || Array.isArray(route)) return;
33
+ const routeRecord = route;
34
+ const model = readMetadataString(routeRecord, "model") ?? readMetadataString(routeRecord, "providerLocalModel");
35
+ if (!model) return;
36
+ return {
37
+ model,
38
+ apiKey: readMetadataString(routeRecord, "apiKey"),
39
+ apiBase: readMetadataString(routeRecord, "apiBase"),
40
+ ...extractRuntimeHeaders(readStringRecord(routeRecord.headers) ?? readStringRecord(routeRecord.extraHeaders) ?? {})
41
+ };
42
+ }
43
+ function buildHermesMessages(params) {
44
+ const { envelope, systemPrompt } = params;
45
+ const messages = [];
46
+ if (systemPrompt) messages.push({
47
+ role: "system",
48
+ content: systemPrompt
49
+ });
50
+ const content = extractMessageText(envelope.message);
51
+ messages.push({
52
+ role: normalizeRole(envelope.message.role),
53
+ content
54
+ });
55
+ return messages;
56
+ }
57
+ function createAssistantMessage(params) {
58
+ const { sessionId, messageId, text, timestamp, metadata } = params;
59
+ return {
60
+ id: messageId,
61
+ sessionId,
62
+ role: "assistant",
63
+ status: "final",
64
+ parts: [{
65
+ type: "text",
66
+ text
67
+ }],
68
+ timestamp,
69
+ ...metadata ? { metadata } : {}
70
+ };
71
+ }
72
+ function createAssistantMessageFromParts(params) {
73
+ const { sessionId, messageId, parts, timestamp, metadata } = params;
74
+ return {
75
+ id: messageId,
76
+ sessionId,
77
+ role: "assistant",
78
+ status: "final",
79
+ parts: structuredClone(parts),
80
+ timestamp,
81
+ ...metadata ? { metadata } : {}
82
+ };
83
+ }
84
+ var HermesAssistantEventCollector = class {
85
+ parts = [];
86
+ toolPartIndexByCallId = /* @__PURE__ */ new Map();
87
+ applyEvent = (event) => {
88
+ switch (event.type) {
89
+ case NcpEventType.MessageTextDelta:
90
+ this.appendTextPart(event.payload.delta);
91
+ return;
92
+ case NcpEventType.MessageReasoningDelta:
93
+ this.appendReasoningPart(event.payload.delta);
94
+ return;
95
+ case NcpEventType.MessageToolCallStart:
96
+ this.upsertToolInvocationPart({
97
+ type: "tool-invocation",
98
+ toolCallId: event.payload.toolCallId,
99
+ toolName: event.payload.toolName,
100
+ state: "partial-call",
101
+ args: ""
102
+ });
103
+ return;
104
+ case NcpEventType.MessageToolCallArgsDelta:
105
+ this.applyToolCallArgsDelta(event.payload.toolCallId, event.payload.delta);
106
+ return;
107
+ case NcpEventType.MessageToolCallArgs:
108
+ this.upsertToolInvocationPart({
109
+ type: "tool-invocation",
110
+ toolCallId: event.payload.toolCallId,
111
+ toolName: this.readToolName(event.payload.toolCallId),
112
+ state: "partial-call",
113
+ args: event.payload.args
114
+ });
115
+ return;
116
+ case NcpEventType.MessageToolCallEnd:
117
+ this.upsertToolInvocationPart({
118
+ type: "tool-invocation",
119
+ toolCallId: event.payload.toolCallId,
120
+ toolName: this.readToolName(event.payload.toolCallId),
121
+ state: "call",
122
+ args: this.readToolArgs(event.payload.toolCallId)
123
+ });
124
+ return;
125
+ default: return;
126
+ }
127
+ };
128
+ hasParts = () => this.parts.length > 0;
129
+ buildParts = () => structuredClone(this.parts);
130
+ appendTextPart = (delta) => {
131
+ if (!delta) return;
132
+ const lastPart = this.parts.at(-1);
133
+ if (lastPart?.type === "text") {
134
+ lastPart.text = `${lastPart.text}${delta}`;
135
+ return;
136
+ }
137
+ this.parts.push({
138
+ type: "text",
139
+ text: delta
140
+ });
141
+ };
142
+ appendReasoningPart = (delta) => {
143
+ if (!delta) return;
144
+ const lastPart = this.parts.at(-1);
145
+ if (lastPart?.type === "reasoning") {
146
+ lastPart.text = `${lastPart.text}${delta}`;
147
+ return;
148
+ }
149
+ this.parts.push({
150
+ type: "reasoning",
151
+ text: delta
152
+ });
153
+ };
154
+ applyToolCallArgsDelta = (toolCallId, delta) => {
155
+ const currentArgs = this.readToolArgs(toolCallId);
156
+ this.upsertToolInvocationPart({
157
+ type: "tool-invocation",
158
+ toolCallId,
159
+ toolName: this.readToolName(toolCallId),
160
+ state: "partial-call",
161
+ args: `${currentArgs}${delta}`
162
+ });
163
+ };
164
+ upsertToolInvocationPart = (nextPart) => {
165
+ const normalizedToolCallId = nextPart.toolCallId?.trim();
166
+ if (!normalizedToolCallId) {
167
+ this.parts.push({ ...nextPart });
168
+ return;
169
+ }
170
+ const existingIndex = this.toolPartIndexByCallId.get(normalizedToolCallId);
171
+ if (typeof existingIndex === "number") {
172
+ const existingPart = this.parts[existingIndex];
173
+ if (existingPart?.type !== "tool-invocation") return;
174
+ this.parts[existingIndex] = {
175
+ ...existingPart,
176
+ ...nextPart,
177
+ toolCallId: normalizedToolCallId,
178
+ toolName: nextPart.toolName || existingPart.toolName,
179
+ args: nextPart.args ?? existingPart.args
180
+ };
181
+ return;
182
+ }
183
+ this.toolPartIndexByCallId.set(normalizedToolCallId, this.parts.length);
184
+ this.parts.push({
185
+ ...nextPart,
186
+ toolCallId: normalizedToolCallId
187
+ });
188
+ };
189
+ readToolArgs = (toolCallId) => {
190
+ const part = this.findToolPart(toolCallId);
191
+ if (!part) return "";
192
+ return typeof part.args === "string" ? part.args : JSON.stringify(part.args ?? "");
193
+ };
194
+ readToolName = (toolCallId) => {
195
+ return this.findToolPart(toolCallId)?.toolName ?? "unknown";
196
+ };
197
+ findToolPart = (toolCallId) => {
198
+ const existingIndex = this.toolPartIndexByCallId.get(toolCallId);
199
+ if (typeof existingIndex !== "number") return null;
200
+ const part = this.parts[existingIndex];
201
+ return part?.type === "tool-invocation" ? part : null;
202
+ };
203
+ };
204
+ var HermesInlineToolTraceTranslator = class {
205
+ pendingTextBuffer = "";
206
+ sawStructuredToolCall = false;
207
+ toolCallCount = 0;
208
+ translate = async function* (events) {
209
+ for await (const event of events) {
210
+ if (this.isStructuredToolCallEvent(event)) {
211
+ this.sawStructuredToolCall = true;
212
+ yield* this.flushPendingText({
213
+ sessionId: this.readEventSessionId(event),
214
+ messageId: this.readEventMessageId(event),
215
+ flush: true
216
+ });
217
+ yield event;
218
+ continue;
219
+ }
220
+ if (!this.sawStructuredToolCall && event.type === NcpEventType.MessageTextDelta) {
221
+ this.pendingTextBuffer += event.payload.delta;
222
+ yield* this.flushPendingText({
223
+ sessionId: event.payload.sessionId,
224
+ messageId: event.payload.messageId,
225
+ flush: false
226
+ });
227
+ continue;
228
+ }
229
+ if (!this.sawStructuredToolCall && this.shouldFlushPendingText(event)) yield* this.flushPendingText({
230
+ sessionId: this.readEventSessionId(event),
231
+ messageId: this.readEventMessageId(event),
232
+ flush: true
233
+ });
234
+ yield event;
235
+ }
236
+ };
237
+ flushPendingText = function* (params) {
238
+ if (!this.pendingTextBuffer) return;
239
+ const lastNewlineIndex = this.pendingTextBuffer.lastIndexOf("\n");
240
+ const flushableText = params.flush ? this.pendingTextBuffer : lastNewlineIndex >= 0 ? this.pendingTextBuffer.slice(0, lastNewlineIndex + 1) : this.pendingTextBuffer.includes("`") ? "" : this.pendingTextBuffer;
241
+ if (!flushableText) return;
242
+ this.pendingTextBuffer = this.pendingTextBuffer.slice(flushableText.length);
243
+ for (const segment of splitIntoLineSegments(flushableText)) {
244
+ const inlineToolTrace = matchHermesInlineToolTrace(segment);
245
+ if (inlineToolTrace && params.sessionId) {
246
+ const toolCallId = `hermes-inline-tool-${++this.toolCallCount}`;
247
+ yield {
248
+ type: NcpEventType.MessageToolCallStart,
249
+ payload: {
250
+ sessionId: params.sessionId,
251
+ ...params.messageId ? { messageId: params.messageId } : {},
252
+ toolCallId,
253
+ toolName: inlineToolTrace.toolName
254
+ }
255
+ };
256
+ yield {
257
+ type: NcpEventType.MessageToolCallArgs,
258
+ payload: {
259
+ sessionId: params.sessionId,
260
+ toolCallId,
261
+ args: inlineToolTrace.args
262
+ }
263
+ };
264
+ yield {
265
+ type: NcpEventType.MessageToolCallEnd,
266
+ payload: {
267
+ sessionId: params.sessionId,
268
+ toolCallId
269
+ }
270
+ };
271
+ continue;
272
+ }
273
+ if (!segment || !params.sessionId || !params.messageId) continue;
274
+ yield {
275
+ type: NcpEventType.MessageTextDelta,
276
+ payload: {
277
+ sessionId: params.sessionId,
278
+ messageId: params.messageId,
279
+ delta: segment
280
+ }
281
+ };
282
+ }
283
+ };
284
+ shouldFlushPendingText = (event) => event.type === NcpEventType.MessageTextEnd || event.type === NcpEventType.MessageCompleted || event.type === NcpEventType.MessageFailed || event.type === NcpEventType.RunFinished || event.type === NcpEventType.RunError;
285
+ isStructuredToolCallEvent = (event) => event.type === NcpEventType.MessageToolCallStart || event.type === NcpEventType.MessageToolCallArgs || event.type === NcpEventType.MessageToolCallArgsDelta || event.type === NcpEventType.MessageToolCallEnd || event.type === NcpEventType.MessageToolCallResult;
286
+ readEventSessionId = (event) => {
287
+ if (!("payload" in event) || !event.payload || typeof event.payload !== "object") return;
288
+ return "sessionId" in event.payload && typeof event.payload.sessionId === "string" ? event.payload.sessionId : void 0;
289
+ };
290
+ readEventMessageId = (event) => {
291
+ if (!("payload" in event) || !event.payload || typeof event.payload !== "object") return;
292
+ return "messageId" in event.payload && typeof event.payload.messageId === "string" ? event.payload.messageId : void 0;
293
+ };
294
+ };
295
+ var HermesReasoningDeltaTranslator = class {
296
+ normalizer = new NcpAssistantTextStreamNormalizer("think-tags");
297
+ translate = async function* (events) {
298
+ for await (const event of events) {
299
+ if (event.type === NcpEventType.MessageTextDelta) {
300
+ yield* this.emitNormalizedTextDelta(event);
301
+ continue;
302
+ }
303
+ if (this.shouldFlushPendingText(event)) yield* this.flushPendingText(event);
304
+ yield event;
305
+ }
306
+ yield* this.flushSegments();
307
+ };
308
+ emitNormalizedTextDelta = function* (event) {
309
+ const segments = this.normalizer.push(event.payload.delta);
310
+ for (const segment of segments) {
311
+ if (!segment.text) continue;
312
+ if (segment.type === "reasoning") {
313
+ yield {
314
+ type: NcpEventType.MessageReasoningDelta,
315
+ payload: {
316
+ sessionId: event.payload.sessionId,
317
+ messageId: event.payload.messageId,
318
+ delta: segment.text
319
+ }
320
+ };
321
+ continue;
322
+ }
323
+ yield {
324
+ type: NcpEventType.MessageTextDelta,
325
+ payload: {
326
+ sessionId: event.payload.sessionId,
327
+ messageId: event.payload.messageId,
328
+ delta: segment.text
329
+ }
330
+ };
331
+ }
332
+ };
333
+ flushPendingText = function* (event) {
334
+ const sessionId = this.readEventSessionId(event);
335
+ const messageId = this.readEventMessageId(event);
336
+ if (!sessionId || !messageId) {
337
+ yield* this.flushSegments();
338
+ return;
339
+ }
340
+ const segments = this.normalizer.finish();
341
+ for (const segment of segments) {
342
+ if (!segment.text) continue;
343
+ if (segment.type === "reasoning") {
344
+ yield {
345
+ type: NcpEventType.MessageReasoningDelta,
346
+ payload: {
347
+ sessionId,
348
+ messageId,
349
+ delta: segment.text
350
+ }
351
+ };
352
+ continue;
353
+ }
354
+ yield {
355
+ type: NcpEventType.MessageTextDelta,
356
+ payload: {
357
+ sessionId,
358
+ messageId,
359
+ delta: segment.text
360
+ }
361
+ };
362
+ }
363
+ };
364
+ flushSegments = function* () {
365
+ this.normalizer.finish();
366
+ };
367
+ shouldFlushPendingText = (event) => event.type === NcpEventType.MessageTextEnd || event.type === NcpEventType.MessageCompleted || event.type === NcpEventType.MessageFailed || event.type === NcpEventType.RunFinished || event.type === NcpEventType.RunError;
368
+ readEventSessionId = (event) => {
369
+ if (!("payload" in event) || !event.payload || typeof event.payload !== "object") return;
370
+ return "sessionId" in event.payload && typeof event.payload.sessionId === "string" ? event.payload.sessionId : void 0;
371
+ };
372
+ readEventMessageId = (event) => {
373
+ if (!("payload" in event) || !event.payload || typeof event.payload !== "object") return;
374
+ return "messageId" in event.payload && typeof event.payload.messageId === "string" ? event.payload.messageId : void 0;
375
+ };
376
+ };
377
+ function resolveHermesModel(params) {
378
+ const { envelope, fallbackModel } = params;
379
+ const providerRoute = readHermesProviderRoute(envelope);
380
+ const metadata = envelope.metadata && typeof envelope.metadata === "object" && !Array.isArray(envelope.metadata) ? envelope.metadata : void 0;
381
+ return providerRoute?.model ?? readMetadataString(metadata, "preferred_model") ?? readMetadataString(metadata, "preferredModel") ?? readMetadataString(metadata, "model") ?? fallbackModel;
382
+ }
383
+ function normalizeHermesRequestedModel(model) {
384
+ const trimmed = model.trim();
385
+ if (!trimmed) return trimmed;
386
+ const slashIndex = trimmed.indexOf("/");
387
+ if (slashIndex <= 0) return trimmed;
388
+ const suffix = trimmed.slice(slashIndex + 1).trim();
389
+ if (!suffix) return trimmed;
390
+ if (suffix.includes(":")) return suffix;
391
+ return trimmed;
392
+ }
393
+ function inferHermesProvider(params) {
394
+ if (params.apiMode === "anthropic_messages") return "anthropic";
395
+ const model = params.model.trim().toLowerCase();
396
+ if (readHostname(params.apiBase).includes("anthropic.com") || model.startsWith("claude")) return "anthropic";
397
+ return "openai";
398
+ }
399
+ function toNcpError(error, code) {
400
+ return {
401
+ code,
402
+ message: error instanceof Error ? error.message : String(error)
403
+ };
404
+ }
405
+ function toNcpSseFrame(event) {
406
+ return `event: ncp-event\ndata: ${JSON.stringify(event)}\n\n`;
407
+ }
408
+ function toErrorSseFrame(error) {
409
+ return `event: error\ndata: ${JSON.stringify(error)}\n\n`;
410
+ }
411
+ function readHostname(value) {
412
+ if (!value) return "";
413
+ try {
414
+ return new URL(value).hostname.trim().toLowerCase();
415
+ } catch {
416
+ return "";
417
+ }
418
+ }
419
+ function extractRuntimeHeaders(headers) {
420
+ const nextHeaders = { ...headers };
421
+ const apiMode = nextHeaders[NARP_API_MODE_HEADER];
422
+ delete nextHeaders[NARP_API_MODE_HEADER];
423
+ return {
424
+ headers: nextHeaders,
425
+ ...apiMode ? { apiMode } : {}
426
+ };
427
+ }
428
+ function extractMessageText(message) {
429
+ const text = message.parts.map((part) => {
430
+ if (part.type === "text" || part.type === "reasoning" || part.type === "rich-text") return part.text;
431
+ return "";
432
+ }).join("\n").trim();
433
+ return text.length > 0 ? text : "[empty message]";
434
+ }
435
+ function splitIntoLineSegments(text) {
436
+ return text.match(/[^\n]*\n|[^\n]+$/gu) ?? [];
437
+ }
438
+ function matchHermesInlineToolTrace(segment) {
439
+ const trimmed = segment.trim();
440
+ if (!trimmed.startsWith("`") || !trimmed.endsWith("`")) return null;
441
+ const body = trimmed.slice(1, -1).trim();
442
+ for (const candidate of HERMES_INLINE_TOOL_TRACE_PATTERNS) {
443
+ if (!body.startsWith(candidate.icon)) continue;
444
+ const rawArgs = body.slice(candidate.icon.length).trim();
445
+ if (!rawArgs) return null;
446
+ return {
447
+ toolName: candidate.toolName,
448
+ args: candidate.buildArgs(rawArgs)
449
+ };
450
+ }
451
+ return null;
452
+ }
453
+ function normalizeRole(role) {
454
+ if (role === "assistant" || role === "system") return role;
455
+ return "user";
456
+ }
457
+ //#endregion
458
+ export { HermesAssistantEventCollector, HermesInlineToolTraceTranslator, HermesReasoningDeltaTranslator, buildHermesMessages, createAssistantMessage, createAssistantMessageFromParts, inferHermesProvider, normalizeHermesRequestedModel, readHermesProviderRoute, resolveHermesModel, toErrorSseFrame, toNcpError, toNcpSseFrame };
@@ -0,0 +1,105 @@
1
+ //#region src/hermes-http-adapter-session-store.service.ts
2
+ var HermesHttpAdapterSessionStore = class {
3
+ sessions = /* @__PURE__ */ new Map();
4
+ setPendingRun = (run) => {
5
+ const session = this.getOrCreateEntry(run.envelope.sessionId);
6
+ if (session.pendingRun || session.activeAbortController) throw new Error(`[hermes-http-adapter] session ${run.envelope.sessionId} already has an active or pending run.`);
7
+ session.pendingRun = run;
8
+ this.flushWaiters(run.envelope.sessionId, session);
9
+ };
10
+ waitForPendingRun = async (sessionId, signal, timeoutMs) => {
11
+ const entry = this.getOrCreateEntry(sessionId);
12
+ if (entry.pendingRun) {
13
+ const run = entry.pendingRun;
14
+ entry.pendingRun = void 0;
15
+ return run;
16
+ }
17
+ return await new Promise((resolve, reject) => {
18
+ const waiter = {
19
+ resolve: (run) => {
20
+ cleanup();
21
+ resolve(run);
22
+ },
23
+ reject: (error) => {
24
+ cleanup();
25
+ reject(error);
26
+ }
27
+ };
28
+ const cleanup = () => {
29
+ clearTimeout(timeout);
30
+ signal.removeEventListener("abort", handleAbort);
31
+ entry.waiters.delete(waiter);
32
+ };
33
+ const handleAbort = () => {
34
+ waiter.reject(createAbortError("stream request aborted before send arrived"));
35
+ };
36
+ const timeout = setTimeout(() => {
37
+ waiter.reject(/* @__PURE__ */ new Error(`[hermes-http-adapter] timed out waiting for /send for session ${sessionId}.`));
38
+ }, timeoutMs);
39
+ signal.addEventListener("abort", handleAbort, { once: true });
40
+ entry.waiters.add(waiter);
41
+ });
42
+ };
43
+ setActiveAbortController = (sessionId, controller) => {
44
+ const session = this.getOrCreateEntry(sessionId);
45
+ session.activeAbortController = controller;
46
+ };
47
+ clearActiveAbortController = (sessionId) => {
48
+ const session = this.sessions.get(sessionId);
49
+ if (!session) return;
50
+ session.activeAbortController = void 0;
51
+ this.cleanupSession(sessionId, session);
52
+ };
53
+ abortSession = (sessionId) => {
54
+ const session = this.sessions.get(sessionId);
55
+ if (!session?.activeAbortController) return false;
56
+ session.activeAbortController.abort("session aborted");
57
+ return true;
58
+ };
59
+ setHermesSessionId = (sessionId, hermesSessionId) => {
60
+ const session = this.getOrCreateEntry(sessionId);
61
+ session.hermesSessionId = hermesSessionId;
62
+ };
63
+ readHermesSessionId = (sessionId) => this.sessions.get(sessionId)?.hermesSessionId;
64
+ setSelectedModel = (sessionId, model) => {
65
+ const session = this.getOrCreateEntry(sessionId);
66
+ session.selectedModel = model;
67
+ };
68
+ readSelectedModel = (sessionId) => this.sessions.get(sessionId)?.selectedModel;
69
+ dispose = () => {
70
+ for (const [sessionId, session] of this.sessions.entries()) {
71
+ session.activeAbortController?.abort("adapter disposed");
72
+ for (const waiter of session.waiters) waiter.reject(/* @__PURE__ */ new Error(`[hermes-http-adapter] adapter disposed for ${sessionId}.`));
73
+ session.waiters.clear();
74
+ }
75
+ this.sessions.clear();
76
+ };
77
+ flushWaiters = (sessionId, session) => {
78
+ if (!session.pendingRun || session.waiters.size === 0) return;
79
+ const run = session.pendingRun;
80
+ session.pendingRun = void 0;
81
+ const waiters = [...session.waiters];
82
+ session.waiters.clear();
83
+ for (const waiter of waiters) waiter.resolve(run);
84
+ this.cleanupSession(sessionId, session);
85
+ };
86
+ cleanupSession = (sessionId, session) => {
87
+ if (session.pendingRun || session.activeAbortController || session.waiters.size > 0) return;
88
+ if (session.hermesSessionId || session.selectedModel) return;
89
+ this.sessions.delete(sessionId);
90
+ };
91
+ getOrCreateEntry = (sessionId) => {
92
+ const existing = this.sessions.get(sessionId);
93
+ if (existing) return existing;
94
+ const created = { waiters: /* @__PURE__ */ new Set() };
95
+ this.sessions.set(sessionId, created);
96
+ return created;
97
+ };
98
+ };
99
+ function createAbortError(message) {
100
+ const error = new Error(message);
101
+ error.name = "AbortError";
102
+ return error;
103
+ }
104
+ //#endregion
105
+ export { HermesHttpAdapterSessionStore };
@@ -0,0 +1,14 @@
1
+ import { HermesHttpAdapterResolvedConfig } from "./hermes-http-adapter.types.js";
2
+ import { HermesHttpAdapterConfigInput } from "./hermes-http-adapter-config.utils.js";
3
+
4
+ //#region src/hermes-http-adapter.service.d.ts
5
+ declare class HermesHttpAdapterServer {
6
+ readonly config: HermesHttpAdapterResolvedConfig;
7
+ private readonly routeService;
8
+ private server;
9
+ constructor(configInput?: HermesHttpAdapterConfigInput);
10
+ start: () => Promise<void>;
11
+ stop: () => Promise<void>;
12
+ }
13
+ //#endregion
14
+ export { HermesHttpAdapterServer };