@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.
- package/LICENSE +22 -0
- package/package.json +29 -0
- package/src/cli/format-event.d.ts +14 -0
- package/src/cli/format-event.d.ts.map +1 -0
- package/src/cli/format-event.js +52 -0
- package/src/cli/format-event.js.map +1 -0
- package/src/cli/index.d.ts +5 -0
- package/src/cli/index.d.ts.map +1 -0
- package/src/cli/index.js +5 -0
- package/src/cli/index.js.map +1 -0
- package/src/index.d.ts +28 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +81 -0
- package/src/index.js.map +1 -0
- package/src/server/detect-model.d.ts +21 -0
- package/src/server/detect-model.d.ts.map +1 -0
- package/src/server/detect-model.js +63 -0
- package/src/server/detect-model.js.map +1 -0
- package/src/server/execute.d.ts +20 -0
- package/src/server/execute.d.ts.map +1 -0
- package/src/server/execute.js +389 -0
- package/src/server/execute.js.map +1 -0
- package/src/server/index.d.ts +16 -0
- package/src/server/index.d.ts.map +1 -0
- package/src/server/index.js +43 -0
- package/src/server/index.js.map +1 -0
- package/src/server/skills.d.ts +8 -0
- package/src/server/skills.d.ts.map +1 -0
- package/src/server/skills.js +179 -0
- package/src/server/skills.js.map +1 -0
- package/src/server/test.d.ts +9 -0
- package/src/server/test.d.ts.map +1 -0
- package/src/server/test.js +196 -0
- package/src/server/test.js.map +1 -0
- package/src/shared/constants.d.ts +31 -0
- package/src/shared/constants.d.ts.map +1 -0
- package/src/shared/constants.js +40 -0
- package/src/shared/constants.js.map +1 -0
- package/src/ui/build-config.d.ts +12 -0
- package/src/ui/build-config.d.ts.map +1 -0
- package/src/ui/build-config.js +47 -0
- package/src/ui/build-config.js.map +1 -0
- package/src/ui/index.d.ts +7 -0
- package/src/ui/index.d.ts.map +1 -0
- package/src/ui/index.js +7 -0
- package/src/ui/index.js.map +1 -0
- package/src/ui/parse-stdout.d.ts +25 -0
- package/src/ui/parse-stdout.d.ts.map +1 -0
- package/src/ui/parse-stdout.js +237 -0
- package/src/ui/parse-stdout.js.map +1 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse Hermes Agent stdout into TranscriptEntry objects for the FideliOS UI.
|
|
3
|
+
*
|
|
4
|
+
* Hermes CLI quiet-mode output patterns:
|
|
5
|
+
* Assistant: " โ ๐ฌ {text}"
|
|
6
|
+
* Tool (TTY): " โ {emoji} {verb:9} {detail} {duration}"
|
|
7
|
+
* Tool (pipe): " [done] โ {emoji} {verb:9} {detail} {duration} ({total})"
|
|
8
|
+
* System: "[hermes] ..."
|
|
9
|
+
*
|
|
10
|
+
* We emit structured tool_call/tool_result pairs so FideliOS renders proper
|
|
11
|
+
* tool cards (with status icons, expand/collapse) instead of raw stdout blocks.
|
|
12
|
+
*/
|
|
13
|
+
import { TOOL_OUTPUT_PREFIX } from "../shared/constants.js";
|
|
14
|
+
// โโ Kaomoji / noise stripping โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
15
|
+
/**
|
|
16
|
+
* Strip kawaii faces and decorative emoji from a tool summary line.
|
|
17
|
+
* Leaves meaningful emoji (๐ป for terminal, ๐ for search, etc.) intact
|
|
18
|
+
* by only stripping parenthesized kaomoji like (๏ฝกโโฟโ๏ฝก).
|
|
19
|
+
*/
|
|
20
|
+
function stripKaomoji(text) {
|
|
21
|
+
// Strip parenthesized kaomoji faces: (๏ฝกโโฟโ๏ฝก), (โ
ฯโ
), etc.
|
|
22
|
+
return text.replace(/[(][^()]{2,20}[)]\s*/gu, "").trim();
|
|
23
|
+
}
|
|
24
|
+
// โโ Line classification โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
25
|
+
/** Check if a โ line is an assistant message (โ ๐ฌ ...). */
|
|
26
|
+
function isAssistantToolLine(stripped) {
|
|
27
|
+
return /^โ\s*๐ฌ/.test(stripped);
|
|
28
|
+
}
|
|
29
|
+
/** Extract assistant text from a โ ๐ฌ line. */
|
|
30
|
+
function extractAssistantText(line) {
|
|
31
|
+
return line.replace(/^[\sโ]*๐ฌ\s*/, "").trim();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse a tool completion line into structured data.
|
|
35
|
+
*
|
|
36
|
+
* Handles both TTY and pipe formats:
|
|
37
|
+
* TTY: โ ๐ป $ curl -s "..." 0.1s
|
|
38
|
+
* Pipe: [done] โ ๐ป $ curl -s "..." 0.1s (0.5s)
|
|
39
|
+
*/
|
|
40
|
+
function parseToolCompletionLine(line) {
|
|
41
|
+
// Strip leading whitespace and [done] prefix
|
|
42
|
+
let cleaned = line.trim().replace(/^\[done\]\s*/, "");
|
|
43
|
+
// Must start with โ
|
|
44
|
+
if (!cleaned.startsWith(TOOL_OUTPUT_PREFIX))
|
|
45
|
+
return null;
|
|
46
|
+
// Remove โ prefix and any leading kaomoji face
|
|
47
|
+
cleaned = cleaned.slice(TOOL_OUTPUT_PREFIX.length);
|
|
48
|
+
cleaned = stripKaomoji(cleaned).trim();
|
|
49
|
+
// Now format is: "{emoji} {verb:9} {detail} {duration}" or "{emoji} {verb:9} {detail} {duration} ({total})"
|
|
50
|
+
// Example: "๐ป $ curl -s ..." or "๐ search pattern 0.1s"
|
|
51
|
+
// The verb+detail are separated by whitespace, duration is at the end
|
|
52
|
+
// Match: emoji + verb + detail + duration
|
|
53
|
+
// Duration pattern: N.Ns (possibly followed by (N.Ns))
|
|
54
|
+
const durationMatch = cleaned.match(/([\d.]+s)\s*(?:\([\d.]+s\))?\s*$/);
|
|
55
|
+
const duration = durationMatch ? durationMatch[1] : "";
|
|
56
|
+
// Remove duration from the end to get verb + detail
|
|
57
|
+
let verbAndDetail = durationMatch
|
|
58
|
+
? cleaned.slice(0, cleaned.lastIndexOf(durationMatch[0])).trim()
|
|
59
|
+
: cleaned;
|
|
60
|
+
// Check for error suffixes
|
|
61
|
+
const hasError = /\[(?:exit \d+|error|full)\]/.test(verbAndDetail) ||
|
|
62
|
+
/\[error\]\s*$/.test(cleaned);
|
|
63
|
+
// The first token (after emoji) is the verb, rest is detail
|
|
64
|
+
// Verbs are always a single word or symbol ($ for terminal)
|
|
65
|
+
const parts = verbAndDetail.match(/^(\S+)\s+(.*)/);
|
|
66
|
+
if (!parts) {
|
|
67
|
+
return { name: "tool", detail: verbAndDetail, duration, hasError };
|
|
68
|
+
}
|
|
69
|
+
const verb = parts[1];
|
|
70
|
+
const detail = parts[2].trim();
|
|
71
|
+
// Map Hermes verbs to readable tool names
|
|
72
|
+
const nameMap = {
|
|
73
|
+
"$": "shell",
|
|
74
|
+
"exec": "shell",
|
|
75
|
+
"terminal": "shell",
|
|
76
|
+
"search": "search",
|
|
77
|
+
"fetch": "fetch",
|
|
78
|
+
"crawl": "crawl",
|
|
79
|
+
"navigate": "browser",
|
|
80
|
+
"snapshot": "browser",
|
|
81
|
+
"click": "browser",
|
|
82
|
+
"type": "browser",
|
|
83
|
+
"scroll": "browser",
|
|
84
|
+
"back": "browser",
|
|
85
|
+
"press": "browser",
|
|
86
|
+
"close": "browser",
|
|
87
|
+
"images": "browser",
|
|
88
|
+
"vision": "browser",
|
|
89
|
+
"read": "read",
|
|
90
|
+
"write": "write",
|
|
91
|
+
"patch": "patch",
|
|
92
|
+
"grep": "search",
|
|
93
|
+
"find": "search",
|
|
94
|
+
"plan": "plan",
|
|
95
|
+
"recall": "recall",
|
|
96
|
+
"proc": "process",
|
|
97
|
+
"delegate": "delegate",
|
|
98
|
+
"todo": "todo",
|
|
99
|
+
"memory": "memory",
|
|
100
|
+
"clarify": "clarify",
|
|
101
|
+
"session_search": "recall",
|
|
102
|
+
"code": "execute",
|
|
103
|
+
"execute": "execute",
|
|
104
|
+
"web_search": "search",
|
|
105
|
+
"web_extract": "fetch",
|
|
106
|
+
"browser_navigate": "browser",
|
|
107
|
+
"browser_click": "browser",
|
|
108
|
+
"browser_type": "browser",
|
|
109
|
+
"browser_snapshot": "browser",
|
|
110
|
+
"browser_vision": "browser",
|
|
111
|
+
"browser_scroll": "browser",
|
|
112
|
+
"browser_press": "browser",
|
|
113
|
+
"browser_back": "browser",
|
|
114
|
+
"browser_close": "browser",
|
|
115
|
+
"browser_get_images": "browser",
|
|
116
|
+
"read_file": "read",
|
|
117
|
+
"write_file": "write_file",
|
|
118
|
+
"search_files": "search",
|
|
119
|
+
"patch_file": "patch",
|
|
120
|
+
"execute_code": "execute",
|
|
121
|
+
};
|
|
122
|
+
const name = nameMap[verb.toLowerCase()] || verb;
|
|
123
|
+
return { name, detail, duration, hasError };
|
|
124
|
+
}
|
|
125
|
+
// โโ Synthetic tool ID generation โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
126
|
+
let toolCallCounter = 0;
|
|
127
|
+
/**
|
|
128
|
+
* Generate a synthetic toolUseId for pairing tool_call with tool_result.
|
|
129
|
+
* FideliOS uses this to match them in normalizeTranscript.
|
|
130
|
+
*/
|
|
131
|
+
function syntheticToolUseId() {
|
|
132
|
+
return `hermes-tool-${++toolCallCounter}`;
|
|
133
|
+
}
|
|
134
|
+
// โโ Thinking detection โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
135
|
+
function isThinkingLine(line) {
|
|
136
|
+
return (line.includes("๐ญ") ||
|
|
137
|
+
line.startsWith("<thinking>") ||
|
|
138
|
+
line.startsWith("</thinking>") ||
|
|
139
|
+
line.startsWith("Thinking:"));
|
|
140
|
+
}
|
|
141
|
+
// โโ Main parser โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
142
|
+
/**
|
|
143
|
+
* Parse a single line of Hermes stdout into transcript entries.
|
|
144
|
+
*
|
|
145
|
+
* Emits structured tool_call/tool_result pairs (with synthetic IDs) so
|
|
146
|
+
* FideliOS renders proper tool cards with status icons and expand/collapse.
|
|
147
|
+
*
|
|
148
|
+
* @param line Raw stdout line from Hermes CLI
|
|
149
|
+
* @param ts ISO timestamp for the entry
|
|
150
|
+
* @returns Array of TranscriptEntry objects (may be empty)
|
|
151
|
+
*/
|
|
152
|
+
export function parseHermesStdoutLine(line, ts) {
|
|
153
|
+
const trimmed = line.trim();
|
|
154
|
+
if (!trimmed)
|
|
155
|
+
return [];
|
|
156
|
+
// โโ System/adapter messages โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
157
|
+
if (trimmed.startsWith("[hermes]") || trimmed.startsWith("[fidelios]")) {
|
|
158
|
+
return [{ kind: "system", ts, text: trimmed }];
|
|
159
|
+
}
|
|
160
|
+
// โโ Non-quiet mode tool start lines: [tool] (kaomoji) emoji verb ... โโ
|
|
161
|
+
// These are redundant โ the tool_call/tool_result pair arrives later from
|
|
162
|
+
// the โ completion line. Skip them to avoid duplicate entries.
|
|
163
|
+
if (trimmed.startsWith("[tool]")) {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
// โโ MCP / server init noise reclassified from stderr by wrappedOnLog โโ
|
|
167
|
+
// Pattern: [2026-03-25T10:40:53.941Z] INFO: ...
|
|
168
|
+
// Emit as stderr so FideliOS groups them into the amber accordion.
|
|
169
|
+
if (/^\[\d{4}-\d{2}-\d{2}T/.test(trimmed)) {
|
|
170
|
+
return [{ kind: "stderr", ts, text: trimmed }];
|
|
171
|
+
}
|
|
172
|
+
// โโ Standalone spinner remnants: "๐ป Completed", "๐ป\nCompleted", etc. โ
|
|
173
|
+
// These are non-quiet mode spinner frame leftovers โ skip them.
|
|
174
|
+
if (/^\p{Emoji_Presentation}\s*(Completed|Running|Error)?\s*$/u.test(trimmed)) {
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
// โโ Session info line โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
178
|
+
if (trimmed.startsWith("session_id:")) {
|
|
179
|
+
return [{ kind: "system", ts, text: trimmed }];
|
|
180
|
+
}
|
|
181
|
+
// โโ Quiet-mode tool/message lines (prefixed with โ) โโโโโโโโโโโโโโโโโโโโ
|
|
182
|
+
if (trimmed.includes(TOOL_OUTPUT_PREFIX)) {
|
|
183
|
+
// Assistant message: โ ๐ฌ {text}
|
|
184
|
+
if (isAssistantToolLine(trimmed)) {
|
|
185
|
+
return [{ kind: "assistant", ts, text: extractAssistantText(trimmed) }];
|
|
186
|
+
}
|
|
187
|
+
// Tool completion: โ {emoji} {verb} {detail} {duration}
|
|
188
|
+
const toolInfo = parseToolCompletionLine(trimmed);
|
|
189
|
+
if (toolInfo) {
|
|
190
|
+
const id = syntheticToolUseId();
|
|
191
|
+
const detailText = toolInfo.duration
|
|
192
|
+
? `${toolInfo.detail} ${toolInfo.duration}`
|
|
193
|
+
: toolInfo.detail;
|
|
194
|
+
return [
|
|
195
|
+
{
|
|
196
|
+
kind: "tool_call",
|
|
197
|
+
ts,
|
|
198
|
+
name: toolInfo.name,
|
|
199
|
+
input: { detail: toolInfo.detail },
|
|
200
|
+
toolUseId: id,
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
kind: "tool_result",
|
|
204
|
+
ts,
|
|
205
|
+
toolUseId: id,
|
|
206
|
+
content: detailText,
|
|
207
|
+
isError: toolInfo.hasError,
|
|
208
|
+
},
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
// Fallback: raw โ line that doesn't match tool format
|
|
212
|
+
const stripped = trimmed
|
|
213
|
+
.replace(/^\[done\]\s*/, "")
|
|
214
|
+
.replace(new RegExp(`^${TOOL_OUTPUT_PREFIX.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*`), "")
|
|
215
|
+
.trim();
|
|
216
|
+
return [{ kind: "stdout", ts, text: stripped }];
|
|
217
|
+
}
|
|
218
|
+
// โโ Thinking blocks โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
219
|
+
if (isThinkingLine(trimmed)) {
|
|
220
|
+
return [
|
|
221
|
+
{
|
|
222
|
+
kind: "thinking",
|
|
223
|
+
ts,
|
|
224
|
+
text: trimmed.replace(/^๐ญ\s*/, ""),
|
|
225
|
+
},
|
|
226
|
+
];
|
|
227
|
+
}
|
|
228
|
+
// โโ Error output โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
229
|
+
if (trimmed.startsWith("Error:") ||
|
|
230
|
+
trimmed.startsWith("ERROR:") ||
|
|
231
|
+
trimmed.startsWith("Traceback")) {
|
|
232
|
+
return [{ kind: "stderr", ts, text: trimmed }];
|
|
233
|
+
}
|
|
234
|
+
// โโ Regular assistant output โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
235
|
+
return [{ kind: "assistant", ts, text: trimmed }];
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=parse-stdout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-stdout.js","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"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"}
|