@helmio/openclaw-helmio-chat 0.1.0 → 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.
- package/dist/agent-resolver.d.ts +1 -1
- package/dist/agent-resolver.js +8 -9
- package/dist/agent-resolver.js.map +1 -1
- package/dist/chat-connection.js +16 -7
- package/dist/chat-connection.js.map +1 -1
- package/dist/chat-send-tool.js +30 -27
- package/dist/chat-send-tool.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/url.d.ts +1 -0
- package/dist/url.js +4 -0
- package/dist/url.js.map +1 -0
- package/package.json +1 -1
package/dist/agent-resolver.d.ts
CHANGED
|
@@ -8,5 +8,5 @@ export interface ResolverResult {
|
|
|
8
8
|
agents: ResolvedAgent[];
|
|
9
9
|
ceo: ResolvedAgent | undefined;
|
|
10
10
|
}
|
|
11
|
-
export declare function resolveAgents(configs: RuntimeAgentConfig[]): ResolverResult;
|
|
12
11
|
export declare function parseHelmioAgentId(openclawAgentId: string): number | null;
|
|
12
|
+
export declare function resolveAgents(configs: RuntimeAgentConfig[]): ResolverResult;
|
package/dist/agent-resolver.js
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
|
+
export function parseHelmioAgentId(openclawAgentId) {
|
|
2
|
+
const n = Number.parseInt(openclawAgentId, 10);
|
|
3
|
+
return Number.isFinite(n) && n > 0 ? n : null;
|
|
4
|
+
}
|
|
1
5
|
export function resolveAgents(configs) {
|
|
2
6
|
const agents = [];
|
|
3
7
|
for (const cfg of configs) {
|
|
4
|
-
const helmioAgentId =
|
|
5
|
-
if (
|
|
8
|
+
const helmioAgentId = parseHelmioAgentId(cfg.id);
|
|
9
|
+
if (helmioAgentId === null)
|
|
6
10
|
continue;
|
|
7
11
|
agents.push({
|
|
8
12
|
openclawAgentId: cfg.id,
|
|
9
13
|
helmioAgentId,
|
|
10
|
-
isCeo: cfg.
|
|
14
|
+
isCeo: cfg.params?.isCeo === true,
|
|
11
15
|
});
|
|
12
16
|
}
|
|
13
|
-
|
|
14
|
-
return { agents, ceo };
|
|
15
|
-
}
|
|
16
|
-
export function parseHelmioAgentId(openclawAgentId) {
|
|
17
|
-
const n = Number.parseInt(openclawAgentId, 10);
|
|
18
|
-
return Number.isFinite(n) && n > 0 ? n : null;
|
|
17
|
+
return { agents, ceo: agents.find((a) => a.isCeo) };
|
|
19
18
|
}
|
|
20
19
|
//# sourceMappingURL=agent-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-resolver.js","sourceRoot":"","sources":["../src/agent-resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-resolver.js","sourceRoot":"","sources":["../src/agent-resolver.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,kBAAkB,CAAC,eAAuB;IACxD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAA6B;IACzD,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,aAAa,GAAG,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,aAAa,KAAK,IAAI;YAAE,SAAS;QACrC,MAAM,CAAC,IAAI,CAAC;YACV,eAAe,EAAE,GAAG,CAAC,EAAE;YACvB,aAAa;YACb,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,IAAI;SAClC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;AACtD,CAAC"}
|
package/dist/chat-connection.js
CHANGED
|
@@ -10,6 +10,15 @@ const HEARTBEAT_INTERVAL_MS = 60_000;
|
|
|
10
10
|
export function startChatConnection(opts) {
|
|
11
11
|
let conn;
|
|
12
12
|
let stopped = false;
|
|
13
|
+
let pendingRestart;
|
|
14
|
+
const scheduleRestart = () => {
|
|
15
|
+
if (stopped || pendingRestart)
|
|
16
|
+
return;
|
|
17
|
+
pendingRestart = setTimeout(() => {
|
|
18
|
+
pendingRestart = undefined;
|
|
19
|
+
void restart();
|
|
20
|
+
}, RESTART_BACKOFF_MS);
|
|
21
|
+
};
|
|
13
22
|
const buildConnection = () => new HubConnectionBuilder()
|
|
14
23
|
.withUrl(opts.hubUrl, {
|
|
15
24
|
accessTokenFactory: () => opts.bridgeToken,
|
|
@@ -31,10 +40,7 @@ export function startChatConnection(opts) {
|
|
|
31
40
|
});
|
|
32
41
|
c.onclose((err) => {
|
|
33
42
|
opts.logger.warn(`helmio-chat: connection closed (${err?.message ?? "graceful"})`);
|
|
34
|
-
|
|
35
|
-
// (auth rejected, etc.) where withAutomaticReconnect has given up.
|
|
36
|
-
if (!stopped)
|
|
37
|
-
setTimeout(() => void restart(), RESTART_BACKOFF_MS);
|
|
43
|
+
scheduleRestart();
|
|
38
44
|
});
|
|
39
45
|
};
|
|
40
46
|
const restart = async () => {
|
|
@@ -44,12 +50,11 @@ export function startChatConnection(opts) {
|
|
|
44
50
|
wire(conn);
|
|
45
51
|
try {
|
|
46
52
|
await conn.start();
|
|
47
|
-
opts.logger.info(`helmio-chat: connected to ${opts.hubUrl}
|
|
53
|
+
opts.logger.info(`helmio-chat: connected to ${opts.hubUrl}`);
|
|
48
54
|
}
|
|
49
55
|
catch (err) {
|
|
50
56
|
opts.logger.error(`helmio-chat: connect failed: ${err.message}`);
|
|
51
|
-
|
|
52
|
-
setTimeout(() => void restart(), RESTART_BACKOFF_MS);
|
|
57
|
+
scheduleRestart();
|
|
53
58
|
}
|
|
54
59
|
};
|
|
55
60
|
void restart();
|
|
@@ -60,6 +65,10 @@ export function startChatConnection(opts) {
|
|
|
60
65
|
async stop() {
|
|
61
66
|
stopped = true;
|
|
62
67
|
clearInterval(heartbeat);
|
|
68
|
+
if (pendingRestart) {
|
|
69
|
+
clearTimeout(pendingRestart);
|
|
70
|
+
pendingRestart = undefined;
|
|
71
|
+
}
|
|
63
72
|
try {
|
|
64
73
|
await conn?.stop();
|
|
65
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-connection.js","sourceRoot":"","sources":["../src/chat-connection.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6EAA6E;AAC7E,4EAA4E;AAC5E,8EAA8E;AAC9E,gDAAgD;AAEhD,OAAO,EAEL,oBAAoB,EACpB,kBAAkB,EAClB,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAgB5B,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AACnD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAErC,MAAM,UAAU,mBAAmB,CAAC,IAA2B;IAC7D,IAAI,IAA+B,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-connection.js","sourceRoot":"","sources":["../src/chat-connection.ts"],"names":[],"mappings":"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"}
|
package/dist/chat-send-tool.js
CHANGED
|
@@ -10,12 +10,23 @@
|
|
|
10
10
|
import { ulid } from "ulid";
|
|
11
11
|
import { ConversationKind } from "./events.js";
|
|
12
12
|
import { parseHelmioAgentId } from "./agent-resolver.js";
|
|
13
|
+
import { trimTrailingSlash } from "./url.js";
|
|
14
|
+
class ChatHttpError extends Error {
|
|
15
|
+
status;
|
|
16
|
+
constructor(status, body) {
|
|
17
|
+
super(`helmio_chat_send: ${status} ${body}`);
|
|
18
|
+
this.status = status;
|
|
19
|
+
}
|
|
20
|
+
get retryable() {
|
|
21
|
+
return this.status >= 500 && this.status < 600;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
13
24
|
const MAX_RETRIES = 3;
|
|
14
25
|
const BASE_BACKOFF_MS = 250;
|
|
15
26
|
export function registerChatSendTool(api, opts) {
|
|
16
27
|
const fetchFn = opts.fetchFn ?? globalThis.fetch;
|
|
17
28
|
const newId = opts.idFactory ?? ulid;
|
|
18
|
-
const endpoint = `${opts.helmioApiUrl
|
|
29
|
+
const endpoint = `${trimTrailingSlash(opts.helmioApiUrl)}/api/chat/messages`;
|
|
19
30
|
api.registerTool({
|
|
20
31
|
name: "helmio_chat_send",
|
|
21
32
|
description: "Send a message to the Company's Team conversation. The message appears to all participants (the Company owner and every active agent). Use this to reply to user messages.",
|
|
@@ -49,41 +60,33 @@ export function registerChatSendTool(api, opts) {
|
|
|
49
60
|
});
|
|
50
61
|
}
|
|
51
62
|
async function postWithRetry(fetchFn, endpoint, bridgeToken, payload, logger) {
|
|
63
|
+
const body = JSON.stringify(payload);
|
|
64
|
+
const init = {
|
|
65
|
+
method: "POST",
|
|
66
|
+
headers: {
|
|
67
|
+
Authorization: `Bearer ${bridgeToken}`,
|
|
68
|
+
"Content-Type": "application/json",
|
|
69
|
+
},
|
|
70
|
+
body,
|
|
71
|
+
};
|
|
52
72
|
let lastErr;
|
|
53
73
|
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
54
74
|
try {
|
|
55
|
-
const res = await fetchFn(endpoint,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
body: JSON.stringify(payload),
|
|
62
|
-
});
|
|
63
|
-
if (res.status === 201) {
|
|
64
|
-
const body = (await res.json());
|
|
65
|
-
return { ok: true, messageId: body.messageId };
|
|
66
|
-
}
|
|
67
|
-
if (res.status === 200) {
|
|
68
|
-
// Idempotent replay path — same (conversationId, clientMsgId) already
|
|
69
|
-
// exists server-side. ChatMessagesController returns the prior id.
|
|
70
|
-
const body = (await res.json());
|
|
71
|
-
return { ok: true, messageId: body.messageId, deduplicated: true };
|
|
72
|
-
}
|
|
73
|
-
if (res.status >= 400 && res.status < 500) {
|
|
74
|
-
const text = await res.text();
|
|
75
|
-
throw new Error(`helmio_chat_send: ${res.status} ${text}`);
|
|
75
|
+
const res = await fetchFn(endpoint, init);
|
|
76
|
+
if (res.status === 201 || res.status === 200) {
|
|
77
|
+
const data = (await res.json());
|
|
78
|
+
return res.status === 201
|
|
79
|
+
? { ok: true, messageId: data.messageId }
|
|
80
|
+
: { ok: true, messageId: data.messageId, deduplicated: true };
|
|
76
81
|
}
|
|
77
|
-
// 5xx — retry
|
|
78
82
|
const text = await res.text();
|
|
79
|
-
|
|
80
|
-
logger.warn(`helmio_chat_send: attempt ${attempt}/${MAX_RETRIES} failed (${res.status}); will retry`);
|
|
83
|
+
throw new ChatHttpError(res.status, text);
|
|
81
84
|
}
|
|
82
85
|
catch (err) {
|
|
83
|
-
if (err.
|
|
86
|
+
if (err instanceof ChatHttpError && !err.retryable)
|
|
84
87
|
throw err;
|
|
85
88
|
lastErr = err;
|
|
86
|
-
logger.warn(`helmio_chat_send: attempt ${attempt}/${MAX_RETRIES}
|
|
89
|
+
logger.warn(`helmio_chat_send: attempt ${attempt}/${MAX_RETRIES} failed: ${err.message}`);
|
|
87
90
|
}
|
|
88
91
|
if (attempt < MAX_RETRIES) {
|
|
89
92
|
await sleep(BASE_BACKOFF_MS * 2 ** (attempt - 1));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-send-tool.js","sourceRoot":"","sources":["../src/chat-send-tool.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,wEAAwE;AACxE,qEAAqE;AACrE,wBAAwB;AACxB,EAAE;AACF,uEAAuE;AACvE,4DAA4D;AAC5D,sEAAsE;AACtE,oDAAoD;AAEpD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-send-tool.js","sourceRoot":"","sources":["../src/chat-send-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -12,6 +12,7 @@ import { resolveAgents } from "./agent-resolver.js";
|
|
|
12
12
|
import { startChatConnection } from "./chat-connection.js";
|
|
13
13
|
import { registerChatSendTool } from "./chat-send-tool.js";
|
|
14
14
|
import { routeInbound } from "./inbound-router.js";
|
|
15
|
+
import { trimTrailingSlash } from "./url.js";
|
|
15
16
|
let connection;
|
|
16
17
|
export default definePluginEntry({
|
|
17
18
|
id: "helmio-chat",
|
|
@@ -34,7 +35,7 @@ export default definePluginEntry({
|
|
|
34
35
|
bridgeToken,
|
|
35
36
|
logger: api.logger,
|
|
36
37
|
});
|
|
37
|
-
const hubUrl = `${helmioApiUrl
|
|
38
|
+
const hubUrl = `${trimTrailingSlash(helmioApiUrl)}/api/chat-hub`;
|
|
38
39
|
connection = startChatConnection({
|
|
39
40
|
hubUrl,
|
|
40
41
|
bridgeToken,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,sBAAsB;AACtB,6EAA6E;AAC7E,mEAAmE;AACnE,6EAA6E;AAC7E,yCAAyC;AACzC,6EAA6E;AAC7E,kEAAkE;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAuB,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,sBAAsB;AACtB,6EAA6E;AAC7E,mEAAmE;AACnE,6EAA6E;AAC7E,yCAAyC;AACzC,6EAA6E;AAC7E,kEAAkE;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAuB,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,IAAI,UAAsC,CAAC;AAE3C,eAAe,iBAAiB,CAAC;IAC/B,EAAE,EAAE,aAAa;IACjB,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,OAAO;IAChB,QAAQ,CAAC,GAAG;QACV,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAChD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;QACzD,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,GAAG,CAAC,MAAM,CAAC,KAAK,CACd,8FAA8F,CAC/F,CAAC;YACF,OAAO;QACT,CAAC;QAED,sEAAsE;QACtE,kEAAkE;QAClE,mCAAmC;QACnC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,qCAAqC,OAAO,CAAC,MAAM,CAAC,MAAM,QAAQ,OAAO,CAAC,GAAG,EAAE,eAAe,IAAI,QAAQ,EAAE,CAC7G,CAAC;QAEF,oBAAoB,CAAC,GAAG,EAAE;YACxB,YAAY;YACZ,WAAW;YACX,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,GAAG,iBAAiB,CAAC,YAAY,CAAC,eAAe,CAAC;QACjE,UAAU,GAAG,mBAAmB,CAAC;YAC/B,MAAM;YACN,WAAW;YACX,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBACvB,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE;oBACtC,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,GAAG;iBACJ,CAAC,CAAC;gBACH,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,0BAA0B,GAAG,CAAC,EAAE,oBAAoB,GAAG,CAAC,iBAAiB,YAAY,OAAO,EAAE,CAC/F,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,OAAO;QACX,MAAM,UAAU,EAAE,IAAI,EAAE,CAAC;QACzB,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;CACF,CAAC,CAAC"}
|
package/dist/url.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function trimTrailingSlash(url: string): string;
|
package/dist/url.js
ADDED
package/dist/url.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helmio/openclaw-helmio-chat",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "OpenClaw plugin that bridges Helmio's SignalR ChatHub to per-agent turns inside the Company VM. Installed at cloud-init via `openclaw plugins install npm:@helmio/openclaw-helmio-chat@<pinned>`. ADR-0008.",
|
|
6
6
|
"type": "module",
|