@saleso.innovations/bridge 0.1.8 → 0.1.10
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/INTEGRATION.md +3 -0
- package/README.md +6 -0
- package/dist/client.d.ts +14 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +45 -1
- package/dist/hermesForwarder.d.ts.map +1 -1
- package/dist/hermesForwarder.js +54 -24
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/package.json +1 -1
package/INTEGRATION.md
CHANGED
|
@@ -34,6 +34,9 @@ export async function onCleosPairingCodeSubmitted(code: string) {
|
|
|
34
34
|
for await (const chunk of stream) {
|
|
35
35
|
reply.delta(chunk, sequence++);
|
|
36
36
|
}
|
|
37
|
+
// If you stream from Hermes /v1/chat/completions, also forward tool progress via
|
|
38
|
+
// reply.activity() when you receive `event: hermes.tool.progress` SSE events.
|
|
39
|
+
// Do not inject tool markers into assistant text (see Hermes #6972).
|
|
37
40
|
reply.complete(stream.finalText, sequence);
|
|
38
41
|
},
|
|
39
42
|
});
|
package/README.md
CHANGED
|
@@ -31,6 +31,12 @@ curl -fsSL https://amicable-elephant-407.convex.site/update-bridge.sh | bash
|
|
|
31
31
|
|
|
32
32
|
This installs the latest package, refreshes the CLI symlink, and restarts `cleos-bridge.service` when present.
|
|
33
33
|
|
|
34
|
+
To pin a specific release (e.g. after a Cleos update):
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
curl -fsSL https://amicable-elephant-407.convex.site/update-bridge.sh | bash -s -- 0.1.10
|
|
38
|
+
```
|
|
39
|
+
|
|
34
40
|
## Manual usage
|
|
35
41
|
|
|
36
42
|
The install script puts the bridge in `~/.cleos/bridge`. To run without the symlink:
|
package/dist/client.d.ts
CHANGED
|
@@ -21,9 +21,23 @@ export type UserMessageMeta = {
|
|
|
21
21
|
messageId: string;
|
|
22
22
|
attachments?: UserMessageAttachment[];
|
|
23
23
|
};
|
|
24
|
+
export type AgentActivityPayload = {
|
|
25
|
+
activityType: "tool.started" | "tool.completed";
|
|
26
|
+
tool?: string;
|
|
27
|
+
label?: string;
|
|
28
|
+
emoji?: string;
|
|
29
|
+
sequence: number;
|
|
30
|
+
};
|
|
31
|
+
export type AgentFailedPayload = {
|
|
32
|
+
error: string;
|
|
33
|
+
code?: string;
|
|
34
|
+
sequence?: number;
|
|
35
|
+
};
|
|
24
36
|
export type AgentReply = {
|
|
25
37
|
delta: (text: string, sequence: number) => void;
|
|
38
|
+
activity: (activity: AgentActivityPayload) => void;
|
|
26
39
|
complete: (text: string, sequence: number) => void;
|
|
40
|
+
failed: (failure: AgentFailedPayload) => void;
|
|
27
41
|
};
|
|
28
42
|
export type CronDeliveryMeta = {
|
|
29
43
|
conversationId: string;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoC,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAKhG,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACrG,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -57,6 +57,19 @@ function createReplySender(ws, agentId, conversationId, messageId) {
|
|
|
57
57
|
sequence,
|
|
58
58
|
}));
|
|
59
59
|
},
|
|
60
|
+
activity(activity) {
|
|
61
|
+
ws.send(JSON.stringify({
|
|
62
|
+
type: "agent.activity",
|
|
63
|
+
agentId,
|
|
64
|
+
conversationId,
|
|
65
|
+
messageId,
|
|
66
|
+
activityType: activity.activityType,
|
|
67
|
+
tool: activity.tool,
|
|
68
|
+
label: activity.label,
|
|
69
|
+
emoji: activity.emoji,
|
|
70
|
+
sequence: activity.sequence,
|
|
71
|
+
}));
|
|
72
|
+
},
|
|
60
73
|
complete(text, sequence) {
|
|
61
74
|
ws.send(JSON.stringify({
|
|
62
75
|
type: "agent.message",
|
|
@@ -68,8 +81,32 @@ function createReplySender(ws, agentId, conversationId, messageId) {
|
|
|
68
81
|
final: true,
|
|
69
82
|
}));
|
|
70
83
|
},
|
|
84
|
+
failed(failure) {
|
|
85
|
+
ws.send(JSON.stringify({
|
|
86
|
+
type: "agent.failed",
|
|
87
|
+
agentId,
|
|
88
|
+
conversationId,
|
|
89
|
+
messageId,
|
|
90
|
+
error: failure.error,
|
|
91
|
+
code: failure.code,
|
|
92
|
+
sequence: failure.sequence ?? 0,
|
|
93
|
+
}));
|
|
94
|
+
},
|
|
71
95
|
};
|
|
72
96
|
}
|
|
97
|
+
function userSafeHermesError(error) {
|
|
98
|
+
const raw = error instanceof Error ? error.message : String(error);
|
|
99
|
+
if (raw.includes("not reachable") || raw.includes("health check")) {
|
|
100
|
+
return {
|
|
101
|
+
code: "hermes_unreachable",
|
|
102
|
+
message: "Hermes is not running. Start `hermes gateway` on your agent machine and try again.",
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (raw.includes("Hermes request failed")) {
|
|
106
|
+
return { code: "hermes_request_failed", message: "Hermes could not complete your request. Try again." };
|
|
107
|
+
}
|
|
108
|
+
return { code: "handler_error", message: raw.length > 200 ? `${raw.slice(0, 200)}…` : raw };
|
|
109
|
+
}
|
|
73
110
|
async function openAgentConnection(options) {
|
|
74
111
|
const ws = new WebSocket(options.relayWsUrl);
|
|
75
112
|
let closedResolve = null;
|
|
@@ -101,7 +138,14 @@ async function openAgentConnection(options) {
|
|
|
101
138
|
const replyMessageId = randomUUID();
|
|
102
139
|
const reply = createReplySender(ws, agentId, conversationId, replyMessageId);
|
|
103
140
|
if (options.onUserMessage) {
|
|
104
|
-
|
|
141
|
+
try {
|
|
142
|
+
await options.onUserMessage(content, { agentId, conversationId, messageId: replyMessageId, attachments }, reply);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
const { message, code } = userSafeHermesError(error);
|
|
146
|
+
console.error(JSON.stringify({ event: "cleos-bridge.handler_error", code, message }));
|
|
147
|
+
reply.failed({ error: message, code, sequence: 0 });
|
|
148
|
+
}
|
|
105
149
|
return;
|
|
106
150
|
}
|
|
107
151
|
const echo = `Echo: ${content}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hermesForwarder.d.ts","sourceRoot":"","sources":["../src/hermesForwarder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAyB,eAAe,EAAE,MAAM,aAAa,CAAC;AAGtF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAkBF,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,sBAA2B,GAAG;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf,CAUA;
|
|
1
|
+
{"version":3,"file":"hermesForwarder.d.ts","sourceRoot":"","sources":["../src/hermesForwarder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAyB,eAAe,EAAE,MAAM,aAAa,CAAC;AAGtF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAkBF,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,sBAA2B,GAAG;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf,CAUA;AAyID,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CA4Df;AAED,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,sBAA2B,IAC/D,SAAS,MAAM,EAAE,MAAM,eAAe,EAAE,OAAO,UAAU,KAAG,OAAO,CAAC,IAAI,CAAC,CAMxF"}
|
package/dist/hermesForwarder.js
CHANGED
|
@@ -64,6 +64,52 @@ function extractDeltaFromChunk(payload) {
|
|
|
64
64
|
const content = delta.content;
|
|
65
65
|
return typeof content === "string" ? content : null;
|
|
66
66
|
}
|
|
67
|
+
function processSseEventBlock(eventBlock, reply, counters, onTextDelta) {
|
|
68
|
+
let eventName = "message";
|
|
69
|
+
for (const line of eventBlock.split("\n")) {
|
|
70
|
+
if (line.startsWith("event:")) {
|
|
71
|
+
eventName = line.slice(6).trim();
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (!line.startsWith("data:"))
|
|
75
|
+
continue;
|
|
76
|
+
const data = line.slice(5).trim();
|
|
77
|
+
if (!data || data === "[DONE]")
|
|
78
|
+
continue;
|
|
79
|
+
if (eventName === "hermes.tool.progress") {
|
|
80
|
+
try {
|
|
81
|
+
const payload = JSON.parse(data);
|
|
82
|
+
const tool = typeof payload.tool === "string" ? payload.tool : undefined;
|
|
83
|
+
const label = typeof payload.label === "string" ? payload.label : undefined;
|
|
84
|
+
const emoji = typeof payload.emoji === "string" ? payload.emoji : undefined;
|
|
85
|
+
reply.activity({
|
|
86
|
+
activityType: "tool.started",
|
|
87
|
+
tool,
|
|
88
|
+
label,
|
|
89
|
+
emoji,
|
|
90
|
+
sequence: counters.activitySequence,
|
|
91
|
+
});
|
|
92
|
+
counters.activitySequence += 1;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Ignore malformed tool progress payloads.
|
|
96
|
+
}
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const payload = JSON.parse(data);
|
|
101
|
+
const delta = extractDeltaFromChunk(payload);
|
|
102
|
+
if (delta) {
|
|
103
|
+
onTextDelta(delta);
|
|
104
|
+
reply.delta(delta, counters.textSequence);
|
|
105
|
+
counters.textSequence += 1;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Ignore malformed SSE chunks.
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
67
113
|
function buildHermesUserContent(text, attachments) {
|
|
68
114
|
const trimmed = text.trim();
|
|
69
115
|
const imageParts = (attachments ?? [])
|
|
@@ -121,7 +167,7 @@ export async function forwardToHermes(content, meta, reply, options = {}) {
|
|
|
121
167
|
const reader = response.body.getReader();
|
|
122
168
|
const decoder = new TextDecoder();
|
|
123
169
|
let buffer = "";
|
|
124
|
-
|
|
170
|
+
const counters = { textSequence: 0, activitySequence: 0 };
|
|
125
171
|
let fullText = "";
|
|
126
172
|
while (true) {
|
|
127
173
|
const { done, value } = await reader.read();
|
|
@@ -130,34 +176,18 @@ export async function forwardToHermes(content, meta, reply, options = {}) {
|
|
|
130
176
|
buffer += decoder.decode(value, { stream: true });
|
|
131
177
|
const { events, rest } = parseSseDataLines(buffer);
|
|
132
178
|
buffer = rest;
|
|
133
|
-
for (const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const data = line.slice(6).trim();
|
|
138
|
-
if (!data || data === "[DONE]")
|
|
139
|
-
continue;
|
|
140
|
-
try {
|
|
141
|
-
const payload = JSON.parse(data);
|
|
142
|
-
const delta = extractDeltaFromChunk(payload);
|
|
143
|
-
if (delta) {
|
|
144
|
-
fullText += delta;
|
|
145
|
-
reply.delta(delta, sequence);
|
|
146
|
-
sequence += 1;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
catch {
|
|
150
|
-
// Ignore malformed SSE chunks.
|
|
151
|
-
}
|
|
152
|
-
}
|
|
179
|
+
for (const eventBlock of events) {
|
|
180
|
+
processSseEventBlock(eventBlock, reply, counters, (delta) => {
|
|
181
|
+
fullText += delta;
|
|
182
|
+
});
|
|
153
183
|
}
|
|
154
184
|
}
|
|
155
185
|
if (!fullText.trim()) {
|
|
156
186
|
fullText = "(Hermes returned an empty response)";
|
|
157
|
-
reply.delta(fullText,
|
|
158
|
-
|
|
187
|
+
reply.delta(fullText, counters.textSequence);
|
|
188
|
+
counters.textSequence += 1;
|
|
159
189
|
}
|
|
160
|
-
reply.complete(fullText,
|
|
190
|
+
reply.complete(fullText, counters.textSequence);
|
|
161
191
|
}
|
|
162
192
|
export function createHermesMessageHandler(options = {}) {
|
|
163
193
|
return async (content, meta, reply) => {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { connectHermesAgent, pairCleosAgent, reconnectHermesAgent } from "./client.js";
|
|
2
|
-
export type { AgentReply, ConnectOptions, ConnectResult, CronDeliveryMeta, UserMessageMeta } from "./client.js";
|
|
2
|
+
export type { AgentActivityPayload, AgentFailedPayload, AgentReply, ConnectOptions, ConnectResult, CronDeliveryMeta, UserMessageMeta, } from "./client.js";
|
|
3
3
|
export { loadCredentials, saveCredentials, credentialsPathForDisplay } from "./credentials.js";
|
|
4
4
|
export type { SavedAgentCredentials } from "./credentials.js";
|
|
5
5
|
export { resolvePairingCode, convexSiteUrlFromEnv } from "./resolve.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvF,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvF,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC3G,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,6BAA6B,EAC7B,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
|