@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.
@@ -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;
@@ -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 = Number.parseInt(cfg.id, 10);
5
- if (!Number.isFinite(helmioAgentId) || helmioAgentId <= 0)
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.metadata?.isCeo === true,
14
+ isCeo: cfg.params?.isCeo === true,
11
15
  });
12
16
  }
13
- const ceo = agents.find((a) => a.isCeo);
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":"AAgBA,MAAM,UAAU,aAAa,CAAC,OAA6B;IACzD,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,IAAI,CAAC;YAAE,SAAS;QACpE,MAAM,CAAC,IAAI,CAAC;YACV,eAAe,EAAE,GAAG,CAAC,EAAE;YACvB,aAAa;YACb,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,KAAK,IAAI;SACpC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACzB,CAAC;AAED,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"}
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"}
@@ -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
- // Manual restart covers the unrecoverable-error case
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}; auto-joined Team group on hub side`);
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
- if (!stopped)
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":"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"}
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;IACpB,IAAI,cAAyD,CAAC;IAE9D,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,IAAI,OAAO,IAAI,cAAc;YAAE,OAAO;QACtC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,cAAc,GAAG,SAAS,CAAC;YAC3B,KAAK,OAAO,EAAE,CAAC;QACjB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,GAAG,EAAE,CAC3B,IAAI,oBAAoB,EAAE;SACvB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;QACpB,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW;KAC3C,CAAC;SACD,sBAAsB,CAAC;QACtB,4BAA4B,EAAE,CAAC,GAAG,EAAE,EAAE,CACpC,mBAAmB,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,MAAM;KACxD,CAAC;SACD,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC;SACtC,KAAK,EAAE,CAAC;IAEb,MAAM,IAAI,GAAG,CAAC,CAAgB,EAAE,EAAE;QAChC,CAAC,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,GAAmB,EAAE,EAAE;YAC7C,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACtD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,8CAA8C,GAAG,EAAE,EAAE,KAAM,GAAa,CAAC,OAAO,EAAE,CACnF,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,EAAE;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,GAAG,EAAE,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,aAAa,CAAC,CAAC,YAAY,EAAE,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,YAAY,GAAG,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,GAAG,EAAE,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC;YACnF,eAAe,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,OAAO;YAAE,OAAO;QACpB,IAAI,GAAG,eAAe,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,CAAC;QACX,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAiC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,eAAe,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,OAAO,EAAE,CAAC;IAEf,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CACjB,sBAAsB,IAAI,EAAE,KAAK,IAAI,kBAAkB,CAAC,YAAY,iBAAiB,IAAI,EAAE,YAAY,IAAI,MAAM,EAAE,CACpH,CAAC;IACJ,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAE1B,OAAO;QACL,KAAK,CAAC,IAAI;YACR,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,SAAS,CAAC,CAAC;YACzB,IAAI,cAAc,EAAE,CAAC;gBACnB,YAAY,CAAC,cAAc,CAAC,CAAC;gBAC7B,cAAc,GAAG,SAAS,CAAC;YAC7B,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,IAAI,EAAE,IAAI,EAAE,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA8B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,kBAAkB,CAAC,YAAY;KAC5D,CAAC;AACJ,CAAC"}
@@ -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.replace(/\/+$/, "")}/api/chat/messages`;
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
- method: "POST",
57
- headers: {
58
- Authorization: `Bearer ${bridgeToken}`,
59
- "Content-Type": "application/json",
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
- lastErr = new Error(`helmio_chat_send: ${res.status} ${text}`);
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.message?.startsWith("helmio_chat_send: 4"))
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} threw: ${err.message}`);
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":"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"}
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.replace(/\/+$/, "")}/api/chat-hub`;
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;AAEnD,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,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC;QAClE,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"}
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
@@ -0,0 +1,4 @@
1
+ export function trimTrailingSlash(url) {
2
+ return url.replace(/\/+$/, "");
3
+ }
4
+ //# sourceMappingURL=url.js.map
@@ -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.0",
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",