@saleso.innovations/bridge 0.1.8 → 0.1.9
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/dist/client.d.ts +8 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +13 -0
- 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/dist/client.d.ts
CHANGED
|
@@ -21,8 +21,16 @@ 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
|
+
};
|
|
24
31
|
export type AgentReply = {
|
|
25
32
|
delta: (text: string, sequence: number) => void;
|
|
33
|
+
activity: (activity: AgentActivityPayload) => void;
|
|
26
34
|
complete: (text: string, sequence: number) => void;
|
|
27
35
|
};
|
|
28
36
|
export type CronDeliveryMeta = {
|
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;CACpD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACtE,CAAC;
|
|
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,oBAAoB,GAAG;IACjC,YAAY,EAAE,cAAc,GAAG,gBAAgB,CAAC;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACnD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACtE,CAAC;AA0MF,wBAAsB,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,GAAG,OAAO,CAAC;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CA2BD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAcxF;AAED,wBAAsB,oBAAoB,CAAC,OAAO,GAAE;IAClD,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;CAC5C,GAAG,OAAO,CAAC,aAAa,CAAC,CAc9B"}
|
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",
|
|
@@ -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, 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,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"}
|