@agentvault/claude-bridge 0.7.13 → 0.7.15

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/index.js CHANGED
@@ -267,6 +267,11 @@ var init_launchd = __esm({
267
267
  this.deps.exec("sleep", ["0.25"]);
268
268
  }
269
269
  }
270
+ /** #837: restart in place. Same kickstart install ends with, WITHOUT
271
+ * rewriting the plist — so env baked at the original install survives. */
272
+ restart(label) {
273
+ this.deps.exec("launchctl", ["kickstart", "-k", `${this.domain()}/${label}`]);
274
+ }
270
275
  uninstall(label) {
271
276
  this.deps.exec("launchctl", ["bootout", `${this.domain()}/${label}`]);
272
277
  const path2 = this.plistPath(label);
@@ -331,6 +336,11 @@ var init_systemd = __esm({
331
336
  this.deps.exec("systemctl", ["--user", "enable", `${spec.label}.service`]);
332
337
  this.deps.exec("systemctl", ["--user", "restart", `${spec.label}.service`]);
333
338
  }
339
+ /** #837: restart in place, without daemon-reload or rewriting the unit —
340
+ * so env written at the original install survives. */
341
+ restart(label) {
342
+ this.deps.exec("systemctl", ["--user", "restart", `${label}.service`]);
343
+ }
334
344
  uninstall(label) {
335
345
  this.deps.exec("systemctl", ["--user", "disable", "--now", `${label}.service`]);
336
346
  this.deps.exec("loginctl", ["disable-linger", this.deps.user]);
@@ -389,12 +399,41 @@ var subcommand_exports = {};
389
399
  __export(subcommand_exports, {
390
400
  maybeRunServiceSubcommand: () => maybeRunServiceSubcommand
391
401
  });
402
+ function requireAgentName(env) {
403
+ const name = env.AV_AGENT_NAME?.trim();
404
+ if (!name) {
405
+ throw new Error(
406
+ "AV_AGENT_NAME is required \u2014 it names WHICH agent's service to act on. Re-run as: AV_AGENT_NAME=<agent-name> agentvault-claude-bridge <subcommand>"
407
+ );
408
+ }
409
+ return name;
410
+ }
392
411
  function labelFor(env) {
393
- return `dev.agentvault.bridge-${slugify2(env.AV_AGENT_NAME ?? "claude")}`;
412
+ return `dev.agentvault.bridge-${slugify2(requireAgentName(env))}`;
413
+ }
414
+ function legacyLabelFor(env) {
415
+ return `com.agentvault.claude-bridge.${slugify2(requireAgentName(env))}`;
416
+ }
417
+ function resolveLabel(backend, env) {
418
+ const current = labelFor(env);
419
+ if (backend.status(current).loaded) return current;
420
+ const legacy = legacyLabelFor(env);
421
+ if (backend.status(legacy).loaded) return legacy;
422
+ return current;
394
423
  }
395
424
  function maybeRunServiceSubcommand(argv, env, deps) {
396
425
  const cmd = argv[2];
397
- if (!cmd || !SERVICE_CMDS.has(cmd)) return false;
426
+ if (!cmd) return false;
427
+ if (!SERVICE_CMDS.has(cmd)) {
428
+ const looksLikeToken = cmd.startsWith("av_tok_");
429
+ const looksLikeFlag = cmd.startsWith("-");
430
+ if (!looksLikeToken && !looksLikeFlag) {
431
+ throw new Error(
432
+ `unknown subcommand: ${cmd} \u2014 expected one of ${[...SERVICE_CMDS].join(", ")}, an invite token, or no argument at all`
433
+ );
434
+ }
435
+ return false;
436
+ }
398
437
  const backend = deps?.backend ?? selectBackend(process.platform);
399
438
  const entrypoint = deps?.entrypoint ?? process.argv[1];
400
439
  const log = deps?.log ?? ((m6) => console.error("[bridge] " + m6));
@@ -416,17 +455,23 @@ function maybeRunServiceSubcommand(argv, env, deps) {
416
455
  });
417
456
  backend.install(spec);
418
457
  log(`installed service ${spec.label} \u2014 logs: ${spec.logOut}`);
419
- log(`check it with: agentvault-claude-bridge status`);
458
+ log(
459
+ `check it with: AV_AGENT_NAME=${cfg.agentName} agentvault-claude-bridge status`
460
+ );
420
461
  } else if (cmd === "uninstall") {
421
- const label = labelFor(env);
462
+ const label = resolveLabel(backend, env);
422
463
  backend.uninstall(label);
423
464
  log(`uninstalled service ${label}`);
465
+ } else if (cmd === "restart") {
466
+ const label = resolveLabel(backend, env);
467
+ backend.restart(label);
468
+ log(`restarted service ${label}`);
424
469
  } else if (cmd === "status") {
425
- const label = labelFor(env);
470
+ const label = resolveLabel(backend, env);
426
471
  const st = backend.status(label);
427
472
  log(`${label}: ${st.loaded ? "loaded" : "not loaded"}`);
428
473
  } else if (cmd === "logs") {
429
- const label = labelFor(env);
474
+ const label = resolveLabel(backend, env);
430
475
  log(`logs for ${label} are at <dataDir>/logs/bridge.log (tail -f it)`);
431
476
  }
432
477
  } catch (e7) {
@@ -442,7 +487,7 @@ var init_subcommand = __esm({
442
487
  init_config();
443
488
  init_spec();
444
489
  init_backend();
445
- SERVICE_CMDS = /* @__PURE__ */ new Set(["install", "uninstall", "status", "logs"]);
490
+ SERVICE_CMDS = /* @__PURE__ */ new Set(["install", "uninstall", "restart", "status", "logs"]);
446
491
  }
447
492
  });
448
493
 
@@ -69927,7 +69972,8 @@ ${messageText}`;
69927
69972
  const candidateCount = candidates.filter(Boolean).length;
69928
69973
  const joined = await joinWithFirstMatchingKp(welcomeBytes, candidates);
69929
69974
  if (!joined) {
69930
- console.error(`[SecureChannel] No matching KeyPackage found for Welcome \u2014 cannot join group ${groupId?.slice(0, 8)}. The Welcome is encrypted to a published KP's public key; none of our ${candidateCount} candidate bundle(s) decrypted it. The existing Welcome recovery mechanism will re-request.`);
69975
+ console.error(`[SecureChannel] No matching KeyPackage found for Welcome \u2014 cannot join group ${groupId?.slice(0, 8)}. The Welcome is encrypted to a published KP's public key; none of our ${candidateCount} candidate bundle(s) decrypted it. Requesting a re-Welcome with a fresh KeyPackage.`);
69976
+ if (groupId) void this._requestWelcomeSelfHeal(groupId);
69931
69977
  return;
69932
69978
  }
69933
69979
  const mgr = joined.mgr;
@@ -134411,7 +134457,7 @@ async function main() {
134411
134457
  "[bridge] warning: passing the invite token on the command line is visible to other local users via 'ps'. Prefer: AV_INVITE_TOKEN=\u2026 npx @agentvault/claude-bridge"
134412
134458
  );
134413
134459
  }
134414
- logLine(`[bridge] version: ${true ? "0.7.13" : "dev"}`);
134460
+ logLine(`[bridge] version: ${true ? "0.7.15" : "dev"}`);
134415
134461
  logLine(`[bridge] data dir: ${cfg.dataDir} (${cfg.dataDirSource})`);
134416
134462
  logLine(`[bridge] workspace: ${cfg.workspaceDir} \xB7 permissions: ${cfg.permissionMode} \xB7 enclave dir fenced`);
134417
134463
  if (cfg.armRoom) {
@@ -134443,7 +134489,7 @@ async function main() {
134443
134489
  // its default would render "@agentvault/agentvault@0.7.x" — the wrong
134444
134490
  // package name attached to the bridge's version number, which is worse
134445
134491
  // than either alone.
134446
- clientVersion: `@agentvault/claude-bridge@${true ? "0.7.13" : "dev"}`
134492
+ clientVersion: `@agentvault/claude-bridge@${true ? "0.7.15" : "dev"}`
134447
134493
  });
134448
134494
  const agentSystemPrompt = cfg.systemPrompt ?? `You are ${cfg.agentName}, an AI agent on AgentVault. You talk with your owner in 1:1 direct messages and collaborate with other agents in shared rooms. That is your identity \u2014 introduce yourself by that name and do not claim to be any other agent. To speak, call the say tool. In a 1:1 with your owner, reply to what they say. In a room you see every message \u2014 call say only when you have something worth adding, and otherwise stay silent. Keep messages concise.`;
134449
134495
  const deviceJwt = () => {
@@ -2,6 +2,9 @@ import type { ServiceSpec } from "./spec.js";
2
2
  export interface ServiceBackend {
3
3
  install(spec: ServiceSpec): void;
4
4
  uninstall(label: string): void;
5
+ /** Restart an ALREADY-INSTALLED service without touching its spec (#837).
6
+ * Distinct from install, which re-bakes the plist from the current shell. */
7
+ restart(label: string): void;
5
8
  status(label: string): {
6
9
  loaded: boolean;
7
10
  detail: string;
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/service/backend.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AAED,wBAAgB,WAAW,IAAI,WAAW,CAoBzC;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,cAAc,CAU3F"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/service/backend.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;kFAC8E;IAC9E,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AAED,wBAAgB,WAAW,IAAI,WAAW,CAoBzC;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,cAAc,CAU3F"}
@@ -9,6 +9,9 @@ export declare class LaunchdBackend implements ServiceBackend {
9
9
  private domain;
10
10
  install(spec: ServiceSpec): void;
11
11
  private waitUntilGone;
12
+ /** #837: restart in place. Same kickstart install ends with, WITHOUT
13
+ * rewriting the plist — so env baked at the original install survives. */
14
+ restart(label: string): void;
12
15
  uninstall(label: string): void;
13
16
  status(label: string): {
14
17
  loaded: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../../src/service/launchd.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAUhE,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAkC5D;AAED,qBAAa,cAAe,YAAW,cAAc;IACvC,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW;IAErC,OAAO,CAAC,SAAS;IAGjB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IA2BhC,OAAO,CAAC,aAAa;IAOrB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAI3D"}
1
+ {"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../../src/service/launchd.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAUhE,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAkC5D;AAED,qBAAa,cAAe,YAAW,cAAc;IACvC,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW;IAErC,OAAO,CAAC,SAAS;IAGjB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IA2BhC,OAAO,CAAC,aAAa;IAOrB;+EAC2E;IAC3E,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAI3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"subcommand.d.ts","sourceRoot":"","sources":["../../src/service/subcommand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AAQD;;uFAEuF;AACvF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAkDT"}
1
+ {"version":3,"file":"subcommand.d.ts","sourceRoot":"","sources":["../../src/service/subcommand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AAuDD;;uFAEuF;AACvF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAsFT"}
@@ -10,6 +10,9 @@ export declare class SystemdBackend implements ServiceBackend {
10
10
  constructor(deps: BackendDeps);
11
11
  private unitPath;
12
12
  install(spec: ServiceSpec): void;
13
+ /** #837: restart in place, without daemon-reload or rewriting the unit —
14
+ * so env written at the original install survives. */
15
+ restart(label: string): void;
13
16
  uninstall(label: string): void;
14
17
  status(label: string): {
15
18
  loaded: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"systemd.d.ts","sourceRoot":"","sources":["../../src/service/systemd.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAmBhE;;;sFAGsF;AACtF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAsB3D;AAED,qBAAa,cAAe,YAAW,cAAc;IACvC,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW;IAErC,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAoBhC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ9B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAQ3D"}
1
+ {"version":3,"file":"systemd.d.ts","sourceRoot":"","sources":["../../src/service/systemd.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAmBhE;;;sFAGsF;AACtF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAsB3D;AAED,qBAAa,cAAe,YAAW,cAAc;IACvC,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW;IAErC,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAoBhC;2DACuD;IACvD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ9B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAQ3D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentvault/claude-bridge",
3
- "version": "0.7.13",
3
+ "version": "0.7.15",
4
4
  "type": "module",
5
5
  "description": "AgentVault Claude Bridge — daemon for bridging a Claude agent into secure E2E-encrypted AgentVault 1:1 direct messages and rooms.",
6
6
  "main": "dist/index.js",
@@ -26,6 +26,7 @@
26
26
  "build": "npm --prefix ../plugin run build && tsc --emitDeclarationOnly && node build.mjs",
27
27
  "start": "node dist/index.js",
28
28
  "test": "vitest run",
29
+ "typecheck": "tsc -p tsconfig.test.json",
29
30
  "prepublishOnly": "npm run build"
30
31
  },
31
32
  "dependencies": {