@fideliosai/adapter-hermes-local 0.0.4-canary.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 (50) hide show
  1. package/LICENSE +22 -0
  2. package/package.json +29 -0
  3. package/src/cli/format-event.d.ts +14 -0
  4. package/src/cli/format-event.d.ts.map +1 -0
  5. package/src/cli/format-event.js +52 -0
  6. package/src/cli/format-event.js.map +1 -0
  7. package/src/cli/index.d.ts +5 -0
  8. package/src/cli/index.d.ts.map +1 -0
  9. package/src/cli/index.js +5 -0
  10. package/src/cli/index.js.map +1 -0
  11. package/src/index.d.ts +28 -0
  12. package/src/index.d.ts.map +1 -0
  13. package/src/index.js +81 -0
  14. package/src/index.js.map +1 -0
  15. package/src/server/detect-model.d.ts +21 -0
  16. package/src/server/detect-model.d.ts.map +1 -0
  17. package/src/server/detect-model.js +63 -0
  18. package/src/server/detect-model.js.map +1 -0
  19. package/src/server/execute.d.ts +20 -0
  20. package/src/server/execute.d.ts.map +1 -0
  21. package/src/server/execute.js +389 -0
  22. package/src/server/execute.js.map +1 -0
  23. package/src/server/index.d.ts +16 -0
  24. package/src/server/index.d.ts.map +1 -0
  25. package/src/server/index.js +43 -0
  26. package/src/server/index.js.map +1 -0
  27. package/src/server/skills.d.ts +8 -0
  28. package/src/server/skills.d.ts.map +1 -0
  29. package/src/server/skills.js +179 -0
  30. package/src/server/skills.js.map +1 -0
  31. package/src/server/test.d.ts +9 -0
  32. package/src/server/test.d.ts.map +1 -0
  33. package/src/server/test.js +196 -0
  34. package/src/server/test.js.map +1 -0
  35. package/src/shared/constants.d.ts +31 -0
  36. package/src/shared/constants.d.ts.map +1 -0
  37. package/src/shared/constants.js +40 -0
  38. package/src/shared/constants.js.map +1 -0
  39. package/src/ui/build-config.d.ts +12 -0
  40. package/src/ui/build-config.d.ts.map +1 -0
  41. package/src/ui/build-config.js +47 -0
  42. package/src/ui/build-config.js.map +1 -0
  43. package/src/ui/index.d.ts +7 -0
  44. package/src/ui/index.d.ts.map +1 -0
  45. package/src/ui/index.js +7 -0
  46. package/src/ui/index.js.map +1 -0
  47. package/src/ui/parse-stdout.d.ts +25 -0
  48. package/src/ui/parse-stdout.d.ts.map +1 -0
  49. package/src/ui/parse-stdout.js +237 -0
  50. package/src/ui/parse-stdout.js.map +1 -0
@@ -0,0 +1,389 @@
1
+ /**
2
+ * Server-side execution logic for the Hermes Agent adapter.
3
+ *
4
+ * Spawns `hermes chat -q "..." -Q` as a child process, streams output,
5
+ * and returns structured results to FideliOS.
6
+ *
7
+ * Verified CLI flags (hermes chat):
8
+ * -q/--query single query (non-interactive)
9
+ * -Q/--quiet quiet mode (no banner/spinner, only response + session_id)
10
+ * -m/--model model name (e.g. anthropic/claude-sonnet-4)
11
+ * -t/--toolsets comma-separated toolsets to enable
12
+ * --provider inference provider (auto, openrouter, nous, etc.)
13
+ * -r/--resume resume session by ID
14
+ * -w/--worktree isolated git worktree
15
+ * -v/--verbose verbose output
16
+ * --checkpoints filesystem checkpoints
17
+ */
18
+ import { runChildProcess, buildFideliOSEnv, renderTemplate, ensureAbsoluteDirectory, } from "@fideliosai/adapter-utils/server-utils";
19
+ import { HERMES_CLI, DEFAULT_TIMEOUT_SEC, DEFAULT_GRACE_SEC, VALID_PROVIDERS, } from "../shared/constants.js";
20
+ // ---------------------------------------------------------------------------
21
+ // Config helpers
22
+ // ---------------------------------------------------------------------------
23
+ function cfgString(v) {
24
+ return typeof v === "string" && v.length > 0 ? v : undefined;
25
+ }
26
+ function cfgNumber(v) {
27
+ return typeof v === "number" ? v : undefined;
28
+ }
29
+ function cfgBoolean(v) {
30
+ return typeof v === "boolean" ? v : undefined;
31
+ }
32
+ function cfgStringArray(v) {
33
+ return Array.isArray(v) && v.every((i) => typeof i === "string")
34
+ ? v
35
+ : undefined;
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // Wake-up prompt builder
39
+ // ---------------------------------------------------------------------------
40
+ const DEFAULT_PROMPT_TEMPLATE = `You are "{{agentName}}", an AI agent employee in a FideliOS-managed company.
41
+
42
+ IMPORTANT: Use \`terminal\` tool with \`curl\` for ALL FideliOS API calls (web_extract and browser cannot access localhost).
43
+
44
+ Your FideliOS identity:
45
+ Agent ID: {{agentId}}
46
+ Company ID: {{companyId}}
47
+ API Base: {{fideliosApiUrl}}
48
+
49
+ {{#taskId}}
50
+ ## Assigned Task
51
+
52
+ Issue ID: {{taskId}}
53
+ Title: {{taskTitle}}
54
+
55
+ {{taskBody}}
56
+
57
+ ## Workflow
58
+
59
+ 1. Work on the task using your tools
60
+ 2. When done, mark the issue as completed:
61
+ \`curl -s -X PATCH "{{fideliosApiUrl}}/issues/{{taskId}}" -H "Content-Type: application/json" -d '{"status":"done"}'\`
62
+ 3. Post a completion comment on the issue summarizing what you did:
63
+ \`curl -s -X POST "{{fideliosApiUrl}}/issues/{{taskId}}/comments" -H "Content-Type: application/json" -d '{"body":"DONE: <your summary here>"}'\`
64
+ 4. If this issue has a parent (check the issue body or comments for references like TRA-XX), post a brief notification on the parent issue so the parent owner knows:
65
+ \`curl -s -X POST "{{fideliosApiUrl}}/issues/PARENT_ISSUE_ID/comments" -H "Content-Type: application/json" -d '{"body":"{{agentName}} completed {{taskId}}. Summary: <brief>"}'\`
66
+ {{/taskId}}
67
+
68
+ {{#commentId}}
69
+ ## Comment on This Issue
70
+
71
+ Someone commented. Read it:
72
+ \`curl -s "{{fideliosApiUrl}}/issues/{{taskId}}/comments/{{commentId}}" | python3 -m json.tool\`
73
+
74
+ Address the comment, POST a reply if needed, then continue working.
75
+ {{/commentId}}
76
+
77
+ {{#noTask}}
78
+ ## Heartbeat Wake — Check for Work
79
+
80
+ 1. List ALL open issues assigned to you (todo, backlog, in_progress):
81
+ \`curl -s "{{fideliosApiUrl}}/companies/{{companyId}}/issues?assigneeAgentId={{agentId}}" | python3 -c "import sys,json;issues=json.loads(sys.stdin.read());[print(f'{i[\"identifier\"]} {i[\"status\"]:>12} {i[\"priority\"]:>6} {i[\"title\"]}') for i in issues if i['status'] not in ('done','cancelled')]" \`
82
+
83
+ 2. If issues found, pick the highest priority one that is not done/cancelled and work on it:
84
+ - Read the issue details: \`curl -s "{{fideliosApiUrl}}/issues/ISSUE_ID"\`
85
+ - Do the work in the project directory: {{projectName}}
86
+ - When done, mark complete and post a comment (see Workflow steps 2-4 above)
87
+
88
+ 3. If no issues assigned to you, check for unassigned issues:
89
+ \`curl -s "{{fideliosApiUrl}}/companies/{{companyId}}/issues?status=backlog" | python3 -c "import sys,json;issues=json.loads(sys.stdin.read());[print(f'{i[\"identifier\"]} {i[\"title\"]}') for i in issues if not i.get('assigneeAgentId')]" \`
90
+ If you find a relevant issue, assign it to yourself:
91
+ \`curl -s -X PATCH "{{fideliosApiUrl}}/issues/ISSUE_ID" -H "Content-Type: application/json" -d '{"assigneeAgentId":"{{agentId}}","status":"todo"}'\`
92
+
93
+ 4. If truly nothing to do, report briefly what you checked.
94
+ {{/noTask}}`;
95
+ function buildPrompt(ctx, config) {
96
+ const template = cfgString(config.promptTemplate) || DEFAULT_PROMPT_TEMPLATE;
97
+ const taskId = cfgString(ctx.config?.taskId);
98
+ const taskTitle = cfgString(ctx.config?.taskTitle) || "";
99
+ const taskBody = cfgString(ctx.config?.taskBody) || "";
100
+ const commentId = cfgString(ctx.config?.commentId) || "";
101
+ const wakeReason = cfgString(ctx.config?.wakeReason) || "";
102
+ const agentName = ctx.agent?.name || "Hermes Agent";
103
+ const companyName = cfgString(ctx.config?.companyName) || "";
104
+ const projectName = cfgString(ctx.config?.projectName) || "";
105
+ // Build API URL — ensure it has the /api path
106
+ let fideliosApiUrl = cfgString(config.fideliosApiUrl) ||
107
+ process.env.FIDELIOS_API_URL ||
108
+ "http://127.0.0.1:3100/api";
109
+ // Ensure /api suffix
110
+ if (!fideliosApiUrl.endsWith("/api")) {
111
+ fideliosApiUrl = fideliosApiUrl.replace(/\/+$/, "") + "/api";
112
+ }
113
+ const vars = {
114
+ agentId: ctx.agent?.id || "",
115
+ agentName,
116
+ companyId: ctx.agent?.companyId || "",
117
+ companyName,
118
+ runId: ctx.runId || "",
119
+ taskId: taskId || "",
120
+ taskTitle,
121
+ taskBody,
122
+ commentId,
123
+ wakeReason,
124
+ projectName,
125
+ fideliosApiUrl,
126
+ };
127
+ // Handle conditional sections: {{#key}}...{{/key}}
128
+ let rendered = template;
129
+ // {{#taskId}}...{{/taskId}} — include if task is assigned
130
+ rendered = rendered.replace(/\{\{#taskId\}\}([\s\S]*?)\{\{\/taskId\}\}/g, taskId ? "$1" : "");
131
+ // {{#noTask}}...{{/noTask}} — include if no task
132
+ rendered = rendered.replace(/\{\{#noTask\}\}([\s\S]*?)\{\{\/noTask\}\}/g, taskId ? "" : "$1");
133
+ // {{#commentId}}...{{/commentId}} — include if comment exists
134
+ rendered = rendered.replace(/\{\{#commentId\}\}([\s\S]*?)\{\{\/commentId\}\}/g, commentId ? "$1" : "");
135
+ // Replace remaining {{variable}} placeholders
136
+ return renderTemplate(rendered, vars);
137
+ }
138
+ // ---------------------------------------------------------------------------
139
+ // Output parsing
140
+ // ---------------------------------------------------------------------------
141
+ /** Regex to extract session ID from Hermes quiet-mode output: "session_id: <id>" */
142
+ const SESSION_ID_REGEX = /^session_id:\s*(\S+)/m;
143
+ /** Regex for legacy session output format */
144
+ const SESSION_ID_REGEX_LEGACY = /session[_ ](?:id|saved)[:\s]+([a-zA-Z0-9_-]+)/i;
145
+ /** Regex to extract token usage from Hermes output. */
146
+ const TOKEN_USAGE_REGEX = /tokens?[:\s]+(\d+)\s*(?:input|in)\b.*?(\d+)\s*(?:output|out)\b/i;
147
+ /** Regex to extract cost from Hermes output. */
148
+ const COST_REGEX = /(?:cost|spent)[:\s]*\$?([\d.]+)/i;
149
+ // ---------------------------------------------------------------------------
150
+ // Response cleaning
151
+ // ---------------------------------------------------------------------------
152
+ /** Strip noise lines from a Hermes response (tool output, system messages, etc.) */
153
+ function cleanResponse(raw) {
154
+ return raw
155
+ .split("\n")
156
+ .filter((line) => {
157
+ const t = line.trim();
158
+ if (!t)
159
+ return true; // keep blank lines for paragraph separation
160
+ if (t.startsWith("[tool]") || t.startsWith("[hermes]") || t.startsWith("[fidelios]"))
161
+ return false;
162
+ if (t.startsWith("session_id:"))
163
+ return false;
164
+ if (/^\[\d{4}-\d{2}-\d{2}T/.test(t))
165
+ return false;
166
+ if (/^\[done\]\s*┊/.test(t))
167
+ return false;
168
+ if (/^┊\s*[\p{Emoji_Presentation}]/u.test(t) && !/^┊\s*💬/.test(t))
169
+ return false;
170
+ if (/^\p{Emoji_Presentation}\s*(Completed|Running|Error)?\s*$/u.test(t))
171
+ return false;
172
+ return true;
173
+ })
174
+ .map((line) => {
175
+ let t = line.replace(/^[\s]*┊\s*💬\s*/, "").trim();
176
+ t = t.replace(/^\[done\]\s*/, "").trim();
177
+ return t;
178
+ })
179
+ .join("\n")
180
+ .replace(/\n{3,}/g, "\n\n")
181
+ .trim();
182
+ }
183
+ // ---------------------------------------------------------------------------
184
+ // Output parsing
185
+ // ---------------------------------------------------------------------------
186
+ function parseHermesOutput(stdout, stderr) {
187
+ const combined = stdout + "\n" + stderr;
188
+ const result = {};
189
+ // In quiet mode, Hermes outputs:
190
+ // <response text>
191
+ //
192
+ // session_id: <id>
193
+ const sessionMatch = stdout.match(SESSION_ID_REGEX);
194
+ if (sessionMatch?.[1]) {
195
+ result.sessionId = sessionMatch?.[1] ?? null;
196
+ // The response is everything before the session_id line
197
+ const sessionLineIdx = stdout.lastIndexOf("\nsession_id:");
198
+ if (sessionLineIdx > 0) {
199
+ result.response = cleanResponse(stdout.slice(0, sessionLineIdx));
200
+ }
201
+ }
202
+ else {
203
+ // Legacy format (non-quiet mode)
204
+ const legacyMatch = combined.match(SESSION_ID_REGEX_LEGACY);
205
+ if (legacyMatch?.[1]) {
206
+ result.sessionId = legacyMatch?.[1] ?? null;
207
+ }
208
+ // In non-quiet mode, extract clean response from stdout by
209
+ // filtering out tool lines, system messages, and noise
210
+ const cleaned = cleanResponse(stdout);
211
+ if (cleaned.length > 0) {
212
+ result.response = cleaned;
213
+ }
214
+ }
215
+ // Extract token usage
216
+ const usageMatch = combined.match(TOKEN_USAGE_REGEX);
217
+ if (usageMatch) {
218
+ result.usage = {
219
+ inputTokens: parseInt(usageMatch[1], 10) || 0,
220
+ outputTokens: parseInt(usageMatch[2], 10) || 0,
221
+ };
222
+ }
223
+ // Extract cost
224
+ const costMatch = combined.match(COST_REGEX);
225
+ if (costMatch?.[1]) {
226
+ result.costUsd = parseFloat(costMatch[1]);
227
+ }
228
+ // Check for error patterns in stderr
229
+ if (stderr.trim()) {
230
+ const errorLines = stderr
231
+ .split("\n")
232
+ .filter((line) => /error|exception|traceback|failed/i.test(line))
233
+ .filter((line) => !/INFO|DEBUG|warn/i.test(line)); // skip log-level noise
234
+ if (errorLines.length > 0) {
235
+ result.errorMessage = errorLines.slice(0, 5).join("\n");
236
+ }
237
+ }
238
+ return result;
239
+ }
240
+ // ---------------------------------------------------------------------------
241
+ // Main execute
242
+ // ---------------------------------------------------------------------------
243
+ export async function execute(ctx) {
244
+ const config = (ctx.agent?.adapterConfig ?? {});
245
+ // ── Resolve configuration ──────────────────────────────────────────────
246
+ const hermesCmd = cfgString(config.hermesCommand) || HERMES_CLI;
247
+ const model = cfgString(config.model);
248
+ const provider = cfgString(config.provider);
249
+ const timeoutSec = cfgNumber(config.timeoutSec) || DEFAULT_TIMEOUT_SEC;
250
+ const graceSec = cfgNumber(config.graceSec) || DEFAULT_GRACE_SEC;
251
+ const toolsets = cfgString(config.toolsets) || cfgStringArray(config.enabledToolsets)?.join(",");
252
+ const extraArgs = cfgStringArray(config.extraArgs);
253
+ const persistSession = cfgBoolean(config.persistSession) !== false;
254
+ const worktreeMode = cfgBoolean(config.worktreeMode) === true;
255
+ const checkpoints = cfgBoolean(config.checkpoints) === true;
256
+ // ── Build prompt ───────────────────────────────────────────────────────
257
+ const prompt = buildPrompt(ctx, config);
258
+ // ── Build command args ─────────────────────────────────────────────────
259
+ // Use -Q (quiet) to get clean output: just response + session_id line
260
+ const useQuiet = cfgBoolean(config.quiet) !== false; // default true
261
+ const args = ["chat", "-q", prompt];
262
+ if (useQuiet)
263
+ args.push("-Q");
264
+ if (model) {
265
+ args.push("-m", model);
266
+ }
267
+ // Only pass --provider if it's a valid Hermes provider choice.
268
+ if (provider && VALID_PROVIDERS.includes(provider)) {
269
+ args.push("--provider", provider);
270
+ }
271
+ if (toolsets) {
272
+ args.push("-t", toolsets);
273
+ }
274
+ if (worktreeMode)
275
+ args.push("-w");
276
+ if (checkpoints)
277
+ args.push("--checkpoints");
278
+ if (cfgBoolean(config.verbose) === true)
279
+ args.push("-v");
280
+ // Tag sessions as "tool" source so they don't clutter the user's session history.
281
+ // Requires hermes-agent >= PR #3255 (feat/session-source-tag).
282
+ args.push("--source", "tool");
283
+ // Session resume
284
+ const prevSessionId = cfgString(ctx.runtime?.sessionParams?.sessionId);
285
+ if (persistSession && prevSessionId) {
286
+ args.push("--resume", prevSessionId);
287
+ }
288
+ if (extraArgs?.length) {
289
+ args.push(...extraArgs);
290
+ }
291
+ // ── Build environment ──────────────────────────────────────────────────
292
+ const env = {
293
+ ...process.env,
294
+ ...buildFideliOSEnv(ctx.agent),
295
+ };
296
+ if (ctx.runId)
297
+ env.FIDELIOS_RUN_ID = ctx.runId;
298
+ const taskId = cfgString(ctx.config?.taskId);
299
+ if (taskId)
300
+ env.FIDELIOS_TASK_ID = taskId;
301
+ const userEnv = config.env;
302
+ if (userEnv && typeof userEnv === "object") {
303
+ Object.assign(env, userEnv);
304
+ }
305
+ // ── Resolve working directory ──────────────────────────────────────────
306
+ const cwd = cfgString(config.cwd) || cfgString(ctx.config?.workspaceDir) || ".";
307
+ try {
308
+ await ensureAbsoluteDirectory(cwd);
309
+ }
310
+ catch {
311
+ // Non-fatal
312
+ }
313
+ // ── Log start ──────────────────────────────────────────────────────────
314
+ await ctx.onLog("stdout", `[hermes] Starting Hermes Agent (model=${model ?? "configured-default"}, timeout=${timeoutSec}s)\n`);
315
+ if (prevSessionId) {
316
+ await ctx.onLog("stdout", `[hermes] Resuming session: ${prevSessionId}\n`);
317
+ }
318
+ // ── Execute ────────────────────────────────────────────────────────────
319
+ // Hermes writes non-error noise to stderr (MCP init, INFO logs, etc).
320
+ // FideliOS renders all stderr as red/error in the UI.
321
+ // Wrap onLog to reclassify benign stderr lines as stdout.
322
+ const wrappedOnLog = async (stream, chunk) => {
323
+ if (stream === "stderr") {
324
+ const trimmed = chunk.trimEnd();
325
+ // Benign patterns that should NOT appear as errors:
326
+ // - Structured log lines: [timestamp] INFO/DEBUG/WARN: ...
327
+ // - MCP server registration messages
328
+ // - Python import/site noise
329
+ const isBenign = /^\[?\d{4}[-/]\d{2}[-/]\d{2}T/.test(trimmed) || // structured timestamps
330
+ /^[A-Z]+:\s+(INFO|DEBUG|WARN|WARNING)\b/.test(trimmed) || // log levels
331
+ /Successfully registered all tools/.test(trimmed) ||
332
+ /MCP [Ss]erver/.test(trimmed) ||
333
+ /tool registered successfully/.test(trimmed) ||
334
+ /Application initialized/.test(trimmed);
335
+ if (isBenign) {
336
+ return ctx.onLog("stdout", chunk);
337
+ }
338
+ }
339
+ return ctx.onLog(stream, chunk);
340
+ };
341
+ const result = await runChildProcess(ctx.runId, hermesCmd, args, {
342
+ cwd,
343
+ env,
344
+ timeoutSec,
345
+ graceSec,
346
+ onLog: wrappedOnLog,
347
+ });
348
+ // ── Parse output ───────────────────────────────────────────────────────
349
+ const parsed = parseHermesOutput(result.stdout || "", result.stderr || "");
350
+ await ctx.onLog("stdout", `[hermes] Exit code: ${result.exitCode ?? "null"}, timed out: ${result.timedOut}\n`);
351
+ if (parsed.sessionId) {
352
+ await ctx.onLog("stdout", `[hermes] Session: ${parsed.sessionId}\n`);
353
+ }
354
+ // ── Build result ───────────────────────────────────────────────────────
355
+ const executionResult = {
356
+ exitCode: result.exitCode,
357
+ signal: result.signal,
358
+ timedOut: result.timedOut,
359
+ provider: provider || null,
360
+ model: model || null,
361
+ };
362
+ if (parsed.errorMessage) {
363
+ executionResult.errorMessage = parsed.errorMessage;
364
+ }
365
+ if (parsed.usage) {
366
+ executionResult.usage = parsed.usage;
367
+ }
368
+ if (parsed.costUsd !== undefined) {
369
+ executionResult.costUsd = parsed.costUsd;
370
+ }
371
+ // Summary from agent response
372
+ if (parsed.response) {
373
+ executionResult.summary = parsed.response.slice(0, 2000);
374
+ }
375
+ // Set resultJson so FideliOS can persist run metadata (used for UI display + auto-comments)
376
+ executionResult.resultJson = {
377
+ result: parsed.response || "",
378
+ session_id: parsed.sessionId || null,
379
+ usage: parsed.usage || null,
380
+ cost_usd: parsed.costUsd ?? null,
381
+ };
382
+ // Store session ID for next run
383
+ if (persistSession && parsed.sessionId) {
384
+ executionResult.sessionParams = { sessionId: parsed.sessionId };
385
+ executionResult.sessionDisplayId = parsed.sessionId.slice(0, 16);
386
+ }
387
+ return executionResult;
388
+ }
389
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/server/execute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Server-side adapter module exports.
3
+ */
4
+ export { execute } from "./execute.js";
5
+ export { testEnvironment } from "./test.js";
6
+ export { detectModel } from "./detect-model.js";
7
+ export { listHermesSkills as listSkills, syncHermesSkills as syncSkills, resolveHermesDesiredSkillNames as resolveDesiredSkillNames, } from "./skills.js";
8
+ import type { AdapterSessionCodec } from "@fideliosai/adapter-utils";
9
+ /**
10
+ * Session codec for structured validation and migration of session parameters.
11
+ *
12
+ * Hermes Agent uses a single `sessionId` for cross-heartbeat session continuity
13
+ * via the `--resume` CLI flag. The codec validates and normalizes this field.
14
+ */
15
+ export declare const sessionCodec: AdapterSessionCodec;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,gBAAgB,IAAI,UAAU,EAC9B,gBAAgB,IAAI,UAAU,EAC9B,8BAA8B,IAAI,wBAAwB,GAC3D,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMtE;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,mBAsB1B,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Server-side adapter module exports.
3
+ */
4
+ export { execute } from "./execute.js";
5
+ export { testEnvironment } from "./test.js";
6
+ export { detectModel } from "./detect-model.js";
7
+ export { listHermesSkills as listSkills, syncHermesSkills as syncSkills, resolveHermesDesiredSkillNames as resolveDesiredSkillNames, } from "./skills.js";
8
+ function readNonEmptyString(value) {
9
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
10
+ }
11
+ /**
12
+ * Session codec for structured validation and migration of session parameters.
13
+ *
14
+ * Hermes Agent uses a single `sessionId` for cross-heartbeat session continuity
15
+ * via the `--resume` CLI flag. The codec validates and normalizes this field.
16
+ */
17
+ export const sessionCodec = {
18
+ deserialize(raw) {
19
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
20
+ return null;
21
+ const record = raw;
22
+ const sessionId = readNonEmptyString(record.sessionId) ??
23
+ readNonEmptyString(record.session_id);
24
+ if (!sessionId)
25
+ return null;
26
+ return { sessionId };
27
+ },
28
+ serialize(params) {
29
+ if (!params)
30
+ return null;
31
+ const sessionId = readNonEmptyString(params.sessionId) ??
32
+ readNonEmptyString(params.session_id);
33
+ if (!sessionId)
34
+ return null;
35
+ return { sessionId };
36
+ },
37
+ getDisplayId(params) {
38
+ if (!params)
39
+ return null;
40
+ return readNonEmptyString(params.sessionId) ?? readNonEmptyString(params.session_id);
41
+ },
42
+ };
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,gBAAgB,IAAI,UAAU,EAC9B,gBAAgB,IAAI,UAAU,EAC9B,8BAA8B,IAAI,wBAAwB,GAC3D,MAAM,aAAa,CAAC;AAIrB,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAwB;IAC/C,WAAW,CAAC,GAAY;QACtB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/E,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,MAAM,SAAS,GACb,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC;YACpC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IACD,SAAS,CAAC,MAAsC;QAC9C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,SAAS,GACb,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC;YACpC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IACD,YAAY,CAAC,MAAsC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACvF,CAAC;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AdapterSkillContext, AdapterSkillSnapshot } from "@fideliosai/adapter-utils";
2
+ export declare function listHermesSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot>;
3
+ export declare function syncHermesSkills(ctx: AdapterSkillContext, _desiredSkills: string[]): Promise<AdapterSkillSnapshot>;
4
+ export declare function resolveHermesDesiredSkillNames(config: Record<string, unknown>, availableEntries: Array<{
5
+ key: string;
6
+ required?: boolean;
7
+ }>): string[];
8
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EAEnB,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AAwMpC,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,mBAAmB,EACxB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAI/B;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAC3D,MAAM,EAAE,CAEV"}