@saleso.innovations/bridge 0.1.18 → 0.1.20

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/README.md CHANGED
@@ -34,7 +34,7 @@ This installs the latest package, refreshes the CLI symlink, and restarts `cleos
34
34
  To pin a specific release (e.g. after a Cleos update):
35
35
 
36
36
  ```bash
37
- curl -fsSL https://amicable-elephant-407.convex.site/update-bridge.sh | bash -s -- 0.1.18
37
+ curl -fsSL https://amicable-elephant-407.convex.site/update-bridge.sh | bash -s -- 0.1.20
38
38
  ```
39
39
 
40
40
  ## Manual usage
@@ -1,4 +1,6 @@
1
1
  import { type SavedAgentCredentials } from "./credentials.js";
2
- export declare function resolveActiveConversationId(credentials?: SavedAgentCredentials): Promise<string>;
2
+ export declare function resolveActiveConversationId(credentials?: SavedAgentCredentials, options?: {
3
+ forceRefresh?: boolean;
4
+ }): Promise<string>;
3
5
  export declare function rememberConversationId(conversationId: string): void;
4
6
  //# sourceMappingURL=activeConversation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"activeConversation.d.ts","sourceRoot":"","sources":["../src/activeConversation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqC,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEjG,wBAAsB,2BAA2B,CAC/C,WAAW,CAAC,EAAE,qBAAqB,GAClC,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAEnE"}
1
+ {"version":3,"file":"activeConversation.d.ts","sourceRoot":"","sources":["../src/activeConversation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqC,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEjG,wBAAsB,2BAA2B,CAC/C,WAAW,CAAC,EAAE,qBAAqB,EACnC,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAEnE"}
@@ -1,12 +1,12 @@
1
1
  import { convexSiteUrlFromEnv } from "./resolve.js";
2
2
  import { hashToken } from "./token.js";
3
3
  import { loadCredentials, patchCredentials } from "./credentials.js";
4
- export async function resolveActiveConversationId(credentials) {
4
+ export async function resolveActiveConversationId(credentials, options = {}) {
5
5
  const resolved = credentials ?? loadCredentials();
6
6
  if (!resolved) {
7
7
  throw new Error("No saved Cleos agent credentials");
8
8
  }
9
- if (resolved.conversationId) {
9
+ if (resolved.conversationId && !options.forceRefresh) {
10
10
  return resolved.conversationId;
11
11
  }
12
12
  const convexSiteUrl = resolved.convexSiteUrl ?? convexSiteUrlFromEnv();
package/dist/cli.js CHANGED
@@ -81,6 +81,21 @@ async function main() {
81
81
  }
82
82
  const session = await reconnectHermesAgent({ onUserMessage });
83
83
  try {
84
+ if (process.platform !== "win32") {
85
+ try {
86
+ const { execSync } = await import("node:child_process");
87
+ const active = execSync("systemctl is-active cleos-bridge.service", {
88
+ encoding: "utf8",
89
+ stdio: ["ignore", "pipe", "ignore"],
90
+ }).trim();
91
+ if (active === "active") {
92
+ console.error("Warning: cleos-bridge.service is running. Stop it first to avoid relay disconnects:\n systemctl stop cleos-bridge.service");
93
+ }
94
+ }
95
+ catch {
96
+ // systemctl unavailable or service not installed.
97
+ }
98
+ }
84
99
  const summary = await backfillCronDeliveries(session, { reset });
85
100
  console.log(JSON.stringify({ event: "cleos-bridge.cron-backfill.complete", ...summary }, null, 2));
86
101
  if (summary.remainingCount > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -193,7 +193,8 @@ async function openAgentConnection(options) {
193
193
  const resolveAck = requestId ? pendingAcks.get(requestId) : undefined;
194
194
  if (resolveAck) {
195
195
  pendingAcks.delete(requestId);
196
- resolveAck(envelope.ok === true);
196
+ const message = typeof envelope.message === "string" ? envelope.message : undefined;
197
+ resolveAck(envelope.ok === true, message);
197
198
  }
198
199
  return;
199
200
  }
@@ -262,13 +263,13 @@ async function openAgentConnection(options) {
262
263
  pendingAcks.delete(messageId);
263
264
  reject(new Error("Cron delivery ack timed out"));
264
265
  }, CRON_DELIVERY_TIMEOUT_MS);
265
- pendingAcks.set(messageId, (ok) => {
266
+ pendingAcks.set(messageId, (ok, failureMessage) => {
266
267
  clearTimeout(timer);
267
268
  if (ok) {
268
269
  resolve();
269
270
  return;
270
271
  }
271
- reject(new Error("Cron delivery persist failed"));
272
+ reject(new Error(failureMessage ?? "Cron delivery persist failed"));
272
273
  });
273
274
  sendCronResult(ws, options.agentId, messageId, content, meta);
274
275
  });
@@ -1 +1 @@
1
- {"version":3,"file":"cronWatcher.d.ts","sourceRoot":"","sources":["../src/cronWatcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,eAAO,MAAM,sBAAsB,QAA+C,CAAC;AAEnF,eAAO,MAAM,oBAAoB,QAAmD,CAAC;AASrF,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF,wBAAgB,kBAAkB,IAAI,GAAG,CAAC,MAAM,CAAC,CAQhD;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAGhE;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,MAA+B,GAAG,MAAM,EAAE,CAoBtF;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,oBAAoB,CAAC,SAAS,GAAE,GAAG,CAAC,MAAM,CAAwB,GAAG,MAAM,EAAE,CAE5F;AAsID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,IAAI,CA8BxE;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;IAC1F,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC,CAsBD"}
1
+ {"version":3,"file":"cronWatcher.d.ts","sourceRoot":"","sources":["../src/cronWatcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,eAAO,MAAM,sBAAsB,QAA+C,CAAC;AAEnF,eAAO,MAAM,oBAAoB,QAAmD,CAAC;AAerF,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF,wBAAgB,kBAAkB,IAAI,GAAG,CAAC,MAAM,CAAC,CAQhD;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAGhE;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,MAA+B,GAAG,MAAM,EAAE,CAoBtF;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,oBAAoB,CAAC,SAAS,GAAE,GAAG,CAAC,MAAM,CAAwB,GAAG,MAAM,EAAE,CAE5F;AA6KD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,IAAI,CA4BxE;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;IAC1F,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC,CAmBD"}
@@ -8,6 +8,11 @@ const HERMES_CRON_JOBS_FILE = join(homedir(), ".hermes", "cron", "jobs.json");
8
8
  export const DELIVERED_INDEX_PATH = join(homedir(), ".cleos", "cron-delivered.json");
9
9
  const POLL_INTERVAL_MS = 5_000;
10
10
  const FILE_SETTLE_MS = 750;
11
+ // Keep in sync with isSilentHermesCronOutput in @repo/backend-types.
12
+ const SILENT_CRON_OUTPUT_PATTERN = /\bstatus:\s*silent\b/i;
13
+ function isSilentHermesCronOutput(content) {
14
+ return SILENT_CRON_OUTPUT_PATTERN.test(content.trim());
15
+ }
11
16
  export function readDeliveredIndex() {
12
17
  try {
13
18
  const parsed = JSON.parse(readFileSync(DELIVERED_INDEX_PATH, "utf8"));
@@ -121,7 +126,7 @@ function sleep(ms) {
121
126
  function isRelayNotOpenError(error) {
122
127
  return error instanceof Error && error.message === "Cleos relay connection is not open";
123
128
  }
124
- async function deliverPendingFiles(session, delivered, conversationId, options) {
129
+ async function deliverPendingFiles(session, delivered, conversationRef, options) {
125
130
  const jobNames = loadHermesCronJobs();
126
131
  for (const filePath of listCronOutputFiles()) {
127
132
  const key = relativeOutputKey(filePath);
@@ -136,30 +141,60 @@ async function deliverPendingFiles(session, delivered, conversationId, options)
136
141
  writeDeliveredIndex(delivered);
137
142
  continue;
138
143
  }
139
- try {
140
- await session.deliverCronResult(content, {
141
- conversationId,
144
+ if (isSilentHermesCronOutput(content)) {
145
+ delivered.add(key);
146
+ writeDeliveredIndex(delivered);
147
+ console.log(JSON.stringify({
148
+ event: "cleos-bridge.cron-skipped-silent",
142
149
  jobId,
143
150
  jobName,
144
- runAt: parseRunAtFromFileName(filePath),
145
- });
151
+ file: key,
152
+ }));
153
+ continue;
146
154
  }
147
- catch (error) {
148
- if (isRelayNotOpenError(error)) {
149
- console.log(JSON.stringify({
150
- event: "cleos-bridge.cron-deferred",
155
+ let retriedAfterConversationRefresh = false;
156
+ let deliveredSuccessfully = false;
157
+ while (true) {
158
+ try {
159
+ await session.deliverCronResult(content, {
160
+ conversationId: conversationRef.value,
161
+ jobId,
162
+ jobName,
163
+ runAt: parseRunAtFromFileName(filePath),
164
+ });
165
+ deliveredSuccessfully = true;
166
+ break;
167
+ }
168
+ catch (error) {
169
+ if (isRelayNotOpenError(error)) {
170
+ console.log(JSON.stringify({
171
+ event: "cleos-bridge.cron-deferred",
172
+ file: key,
173
+ reason: "relay_not_open",
174
+ }));
175
+ return;
176
+ }
177
+ const message = error instanceof Error ? error.message : String(error);
178
+ const shouldRefreshConversation = !retriedAfterConversationRefresh
179
+ && (message.includes("Invalid relay message target")
180
+ || message.includes("Active conversation")
181
+ || message.includes("Cron delivery persist failed"));
182
+ if (shouldRefreshConversation) {
183
+ conversationRef.value = await resolveActiveConversationId(undefined, { forceRefresh: true });
184
+ retriedAfterConversationRefresh = true;
185
+ continue;
186
+ }
187
+ options.onError?.(message);
188
+ console.error(JSON.stringify({
189
+ event: "cleos-bridge.cron-delivery-failed",
151
190
  file: key,
152
- reason: "relay_not_open",
191
+ message,
192
+ conversationId: conversationRef.value,
153
193
  }));
154
- return;
194
+ break;
155
195
  }
156
- const message = error instanceof Error ? error.message : String(error);
157
- options.onError?.(message);
158
- console.error(JSON.stringify({
159
- event: "cleos-bridge.cron-delivery-failed",
160
- file: key,
161
- message,
162
- }));
196
+ }
197
+ if (!deliveredSuccessfully) {
163
198
  continue;
164
199
  }
165
200
  delivered.add(key);
@@ -182,10 +217,8 @@ export function startCronWatcher(options) {
182
217
  if (stopped)
183
218
  return;
184
219
  try {
185
- if (!conversationId) {
186
- conversationId = await resolveActiveConversationId();
187
- }
188
- await deliverPendingFiles(options.session, delivered, conversationId, options);
220
+ conversationId = await resolveActiveConversationId(undefined, { forceRefresh: !conversationId });
221
+ await deliverPendingFiles(options.session, delivered, { value: conversationId }, options);
189
222
  }
190
223
  catch (error) {
191
224
  const message = error instanceof Error ? error.message : String(error);
@@ -206,12 +239,9 @@ export async function runCronBackfill(session, resetIndex) {
206
239
  const clearedEntries = resetIndex ? clearDeliveredIndex() : 0;
207
240
  const delivered = readDeliveredIndex();
208
241
  const pendingAfterReset = listPendingCronFiles(delivered).length;
209
- let conversationId = loadCredentials()?.conversationId ?? null;
210
- if (!conversationId) {
211
- conversationId = await resolveActiveConversationId();
212
- }
242
+ let conversationId = await resolveActiveConversationId(undefined, { forceRefresh: true });
213
243
  const deliveredBefore = delivered.size;
214
- await deliverPendingFiles(session, delivered, conversationId, {});
244
+ await deliverPendingFiles(session, delivered, { value: conversationId }, {});
215
245
  const deliveredCount = delivered.size - deliveredBefore;
216
246
  const remainingCount = listPendingCronFiles(delivered).length;
217
247
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saleso.innovations/bridge",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "Connect your Hermes agent to the Cleos iOS app via pairing code.",
5
5
  "type": "module",
6
6
  "license": "MIT",