@legioncodeinc/honeycomb 0.1.4 → 0.1.6

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.
@@ -5,13 +5,13 @@
5
5
  },
6
6
  "metadata": {
7
7
  "description": "Honeycomb — persistent memory daemon and thin harness clients for AI coding assistants",
8
- "version": "0.1.4"
8
+ "version": "0.1.6"
9
9
  },
10
10
  "plugins": [
11
11
  {
12
12
  "name": "honeycomb",
13
13
  "description": "Honeycomb Claude Code plugin — captures session activity and provides cross-session memory through the local daemon",
14
- "version": "0.1.4",
14
+ "version": "0.1.6",
15
15
  "source": "./harnesses/claude-code"
16
16
  }
17
17
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "honeycomb",
3
3
  "description": "Honeycomb — a long-lived daemon plus thin clients for six coding harnesses, the unified honeycomb CLI, the MCP server, and the embed daemon",
4
- "version": "0.1.4",
4
+ "version": "0.1.6",
5
5
  "author": {
6
6
  "name": "Honeycomb"
7
7
  },
package/README.md CHANGED
@@ -13,8 +13,7 @@
13
13
  </p>
14
14
 
15
15
  <p align="center">
16
- <a href="https://github.com/legioncodeinc/honeycomb/actions"><img src="https://img.shields.io/github/actions/workflow/status/legioncodeinc/honeycomb/ci.yaml?branch=main&label=CI&style=flat-square" alt="CI"></a>
17
- <img src="https://img.shields.io/badge/version-0.1.0-F7A823?style=flat-square" alt="Version 0.1.0">
16
+ <a href="https://www.npmjs.com/package/@legioncodeinc/honeycomb"><img src="https://img.shields.io/npm/v/@legioncodeinc/honeycomb?style=flat-square&color=F7A823&label=version" alt="npm version"></a>
18
17
  <img src="https://img.shields.io/badge/node-%E2%89%A522-339933?style=flat-square&logo=node.js&logoColor=white" alt="Node ≥ 22">
19
18
  <a href="https://deeplake.ai"><img src="https://img.shields.io/badge/powered%20by-Deep%20Lake-ff5a1f?style=flat-square" alt="Powered by Deep Lake"></a>
20
19
  <a href="#license"><img src="https://img.shields.io/badge/license-AGPL--3.0-blue?style=flat-square" alt="AGPL-3.0"></a>
@@ -46,7 +45,7 @@ AI coding agents forget. They forget across sessions, and they forget across too
46
45
  <tr>
47
46
  <td width="50%" valign="top">
48
47
 
49
- #### 🛹 For vibe coders
48
+ #### 🛹 For AI augmented devs
50
49
  Stop re-explaining your project to a fresh agent every morning. Honeycomb remembers your decisions, your conventions, and the fixes that worked, then primes your next session with them automatically. One install command, a friendly dashboard, no SQL, no config gauntlet.
51
50
 
52
51
  </td>
@@ -213,7 +212,7 @@ Four ways to reach the same daemon and the same shared memory:
213
212
 
214
213
  ## 📍 Status & roadmap
215
214
 
216
- Honeycomb is **v0.1.0, pre-release**. We document what's real and flag what's opt-in.
215
+ Honeycomb is **pre-release (v0.1.x)**. We document what's real and flag what's opt-in.
217
216
 
218
217
  **Working today**
219
218
  - Capture-to-recall, proven end-to-end against live Deep Lake (`npm run smoke:golden-path` with credentials).
package/bundle/cli.js CHANGED
@@ -17,6 +17,7 @@ var VERB_TABLE = Object.freeze([
17
17
  { verb: "maintenance", cls: "storage", summary: "run version-history compaction over version-bumped tables (030)" },
18
18
  { verb: "remember", cls: "storage", summary: "write a memory through the daemon (--type fact|convention|preference|decision|gotcha|reference)" },
19
19
  { verb: "recall", cls: "storage", summary: "recall memories through the daemon" },
20
+ { verb: "memory", cls: "storage", summary: "lifecycle: conflicts (list/resolve), stale-refs (list), inspect <id> --lifecycle (058d)" },
20
21
  { verb: "agent", cls: "storage", summary: "run an agent turn through the daemon" },
21
22
  { verb: "ontology", cls: "storage", summary: "inspect/propose ontology changes through the daemon" },
22
23
  { verb: "secret", cls: "storage", summary: "manage named secrets through the daemon" },
@@ -268,21 +269,21 @@ function renderSummary(body, out) {
268
269
  let totalReaped = 0;
269
270
  let totalSkipped = 0;
270
271
  let tablesCompacted = 0;
271
- for (const s of summaries) {
272
- const reaped = s.rowsReaped ?? 0;
273
- const skipped = s.keysSkipped ?? 0;
272
+ for (const s2 of summaries) {
273
+ const reaped = s2.rowsReaped ?? 0;
274
+ const skipped = s2.keysSkipped ?? 0;
274
275
  totalReaped += reaped;
275
276
  totalSkipped += skipped;
276
277
  if (reaped > 0)
277
278
  tablesCompacted += 1;
278
279
  }
279
280
  out(`maintenance compact: ${tablesCompacted}/${summaries.length} table(s) reaped, ${totalReaped} row(s) reaped, ${totalSkipped} key(s) skipped.`);
280
- for (const s of summaries) {
281
- const table = s.table ?? "(unknown)";
282
- const reaped = s.rowsReaped ?? 0;
283
- const scanned = s.keysScanned ?? 0;
284
- const skipped = s.keysSkipped ?? 0;
285
- const errored = s.errored ?? 0;
281
+ for (const s2 of summaries) {
282
+ const table = s2.table ?? "(unknown)";
283
+ const reaped = s2.rowsReaped ?? 0;
284
+ const scanned = s2.keysScanned ?? 0;
285
+ const skipped = s2.keysSkipped ?? 0;
286
+ const errored = s2.errored ?? 0;
286
287
  const flap = skipped > 0 ? ` \u2014 ${skipped} key(s) SKIPPED (survivor not durable; re-run converges)` : "";
287
288
  const err = errored > 0 ? ` \u2014 ${errored} error(s) (fail-soft; re-run)` : "";
288
289
  out(` ${table}: ${reaped} row(s) reaped over ${scanned} key(s)${flap}${err}.`);
@@ -316,6 +317,183 @@ async function runMaintenanceVerb(argv, deps) {
316
317
  return { exitCode: 0 };
317
318
  }
318
319
 
320
+ // dist/src/commands/memory.js
321
+ var MEMORY_CONFLICTS_LIST_ROUTE = "/api/memories/conflicts";
322
+ var MEMORY_CONFLICTS_RESOLVE_ROUTE = "/api/memories/conflicts";
323
+ var MEMORY_STALE_REFS_ROUTE = "/api/memories/stale-refs";
324
+ var MEMORY_DETAIL_ROUTE = "/api/memories";
325
+ var MEMORY_CONFLICT_VERDICTS = Object.freeze(["supersede", "review", "keep-both"]);
326
+ function flagValue2(argv, flag) {
327
+ const idx = argv.indexOf(flag);
328
+ if (idx < 0)
329
+ return void 0;
330
+ const v = argv[idx + 1];
331
+ return v !== void 0 && !v.startsWith("--") ? v : void 0;
332
+ }
333
+ var MEMORY_VALUE_FLAGS = /* @__PURE__ */ new Set(["--status", "--verdict", "--winner", "--reason"]);
334
+ function parseMemoryCliArgs(argv) {
335
+ const positionals = [];
336
+ for (let i = 0; i < argv.length; i += 1) {
337
+ const tok = argv[i];
338
+ if (tok === void 0)
339
+ continue;
340
+ if (MEMORY_VALUE_FLAGS.has(tok)) {
341
+ i += 1;
342
+ continue;
343
+ }
344
+ if (tok.startsWith("--"))
345
+ continue;
346
+ positionals.push(tok);
347
+ }
348
+ return {
349
+ sub: positionals[0] ?? "",
350
+ arg: positionals[1] ?? "",
351
+ id: positionals[2] ?? "",
352
+ status: flagValue2(argv, "--status") ?? "open",
353
+ verdict: flagValue2(argv, "--verdict") ?? "",
354
+ winner: flagValue2(argv, "--winner") ?? "",
355
+ reason: flagValue2(argv, "--reason") ?? "",
356
+ lifecycle: argv.includes("--lifecycle")
357
+ };
358
+ }
359
+ function rowsOf(body, key) {
360
+ if (typeof body !== "object" || body === null)
361
+ return [];
362
+ const arr = body[key];
363
+ return Array.isArray(arr) ? arr : [];
364
+ }
365
+ function s(v) {
366
+ return v === void 0 || v === null ? "" : String(v);
367
+ }
368
+ function renderConflicts(res, json2, out) {
369
+ if (json2) {
370
+ out(JSON.stringify(res.body ?? {}, null, 2));
371
+ return;
372
+ }
373
+ const rows = rowsOf(res.body, "conflicts");
374
+ if (rows.length === 0) {
375
+ out("no conflicts found in scope.");
376
+ return;
377
+ }
378
+ for (const r of rows) {
379
+ const winner = s(r.winnerId) !== "" ? ` winner=${s(r.winnerId)}` : "";
380
+ out(`${s(r.id)} [${s(r.status) || "open"}] ${s(r.memoryAId)} \u21C4 ${s(r.memoryBId)} verdict=${s(r.verdict) || "review"}${winner}`);
381
+ }
382
+ }
383
+ function renderStaleRefs(res, json2, out) {
384
+ if (json2) {
385
+ out(JSON.stringify(res.body ?? {}, null, 2));
386
+ return;
387
+ }
388
+ const rows = rowsOf(res.body, "staleRefs");
389
+ if (rows.length === 0) {
390
+ out("no stale references found in scope.");
391
+ return;
392
+ }
393
+ for (const r of rows) {
394
+ const refs = Array.isArray(r.staleRefs) ? r.staleRefs : [];
395
+ out(`${s(r.memoryId)} [${s(r.refStatus) || "stale"}] refs: ${refs.length > 0 ? refs.join(", ") : "(unrecorded)"}`);
396
+ }
397
+ }
398
+ function buildConflictsRequest(inv, out) {
399
+ if (inv.arg === "resolve") {
400
+ if (inv.id === "") {
401
+ out("usage: honeycomb memory conflicts resolve <id> --verdict <supersede|review|keep-both> [--winner <memory-id>]");
402
+ return null;
403
+ }
404
+ if (!MEMORY_CONFLICT_VERDICTS.includes(inv.verdict)) {
405
+ out(`error: --verdict must be one of: ${MEMORY_CONFLICT_VERDICTS.join(", ")}`);
406
+ return null;
407
+ }
408
+ const body = { verdict: inv.verdict };
409
+ if (inv.winner !== "")
410
+ body.winnerId = inv.winner;
411
+ if (inv.reason !== "")
412
+ body.reason = inv.reason;
413
+ return { method: "POST", path: `${MEMORY_CONFLICTS_RESOLVE_ROUTE}/${encodeURIComponent(inv.id)}/resolve`, body };
414
+ }
415
+ return { method: "GET", path: MEMORY_CONFLICTS_LIST_ROUTE, query: { status: inv.status } };
416
+ }
417
+ async function runMemoryVerb(argv, deps, json2 = false) {
418
+ const out = deps.out ?? ((line) => console.log(line));
419
+ const inv = parseMemoryCliArgs(argv);
420
+ if (inv.sub === "conflicts") {
421
+ const req = buildConflictsRequest(inv, out);
422
+ if (req === null)
423
+ return { exitCode: 1 };
424
+ const res = await deps.daemon.send(req);
425
+ if (res.status >= 400) {
426
+ out(`error: memory conflicts failed (daemon ${res.status}).`);
427
+ return { exitCode: 1 };
428
+ }
429
+ if (inv.arg === "resolve") {
430
+ if (json2)
431
+ out(JSON.stringify(res.body ?? {}, null, 2));
432
+ else
433
+ out(`resolved conflict ${inv.id} (${inv.verdict}).`);
434
+ return { exitCode: 0 };
435
+ }
436
+ renderConflicts(res, json2, out);
437
+ return { exitCode: 0 };
438
+ }
439
+ if (inv.sub === "stale-refs") {
440
+ const res = await deps.daemon.send({ method: "GET", path: MEMORY_STALE_REFS_ROUTE });
441
+ if (res.status >= 400) {
442
+ out(`error: memory stale-refs failed (daemon ${res.status}).`);
443
+ return { exitCode: 1 };
444
+ }
445
+ renderStaleRefs(res, json2, out);
446
+ return { exitCode: 0 };
447
+ }
448
+ if (inv.sub === "inspect") {
449
+ return runInspect(inv, deps, json2, out);
450
+ }
451
+ out("usage: honeycomb memory <conflicts|stale-refs|inspect>");
452
+ out(" conflicts [--status open] list conflicts in scope");
453
+ out(" conflicts resolve <id> --verdict <v> [--winner <id>] resolve via the 058b endpoint");
454
+ out(" stale-refs list memories with stale references");
455
+ out(" inspect <id> --lifecycle show freshness, calibrated confidence, refStatus, conflict, H");
456
+ return { exitCode: inv.sub === "" ? 0 : 1 };
457
+ }
458
+ function n(v) {
459
+ const x = typeof v === "number" ? v : Number(v);
460
+ return Number.isFinite(x) ? x : void 0;
461
+ }
462
+ async function runInspect(inv, deps, json2, out) {
463
+ if (inv.arg === "") {
464
+ out("usage: honeycomb memory inspect <id> [--lifecycle]");
465
+ return { exitCode: 1 };
466
+ }
467
+ const res = await deps.daemon.send({ method: "GET", path: `${MEMORY_DETAIL_ROUTE}/${encodeURIComponent(inv.arg)}` });
468
+ if (res.status >= 400) {
469
+ out(`error: memory ${inv.arg} not found (daemon ${res.status}).`);
470
+ return { exitCode: 1 };
471
+ }
472
+ if (json2) {
473
+ out(JSON.stringify(res.body ?? {}, null, 2));
474
+ return { exitCode: 0 };
475
+ }
476
+ const body = typeof res.body === "object" && res.body !== null ? res.body : {};
477
+ const m = body.memory ?? {};
478
+ if (!inv.lifecycle) {
479
+ out(`memory ${s(m.id) || inv.arg}`);
480
+ return { exitCode: 0 };
481
+ }
482
+ const a = n(m.activation) ?? n(m.freshnessScore) ?? 1;
483
+ const cFactor = n(m.calibratedConfidence) ?? 1;
484
+ const sigma = n(m.staleness) ?? 0;
485
+ const kappa = n(m.kappa) ?? 1;
486
+ const clamp = (x) => Math.min(1, Math.max(0, x));
487
+ const health = clamp(a) * clamp(cFactor) * (1 - clamp(sigma)) * clamp(kappa);
488
+ out(`memory ${s(m.id) || inv.arg} \u2014 lifecycle`);
489
+ out(` freshnessScore ${n(m.freshnessScore) ?? n(m.activation) ?? "(none)"}`);
490
+ out(` calibratedConfidence ${n(m.calibratedConfidence) ?? "(none \u2014 calibration dormant)"}`);
491
+ out(` refStatus ${s(m.refStatus) || "unknown"}`);
492
+ out(` open-conflict ${m.openConflict === true ? "yes" : "no"}`);
493
+ out(` H (health) ${health.toFixed(3)}`);
494
+ return { exitCode: 0 };
495
+ }
496
+
319
497
  // dist/src/daemon/runtime/vault/catalog.js
320
498
  var PROVIDER_CATALOG = Object.freeze([
321
499
  Object.freeze({
@@ -400,9 +578,9 @@ function coerceSettingValue(value) {
400
578
  if (value === "false")
401
579
  return false;
402
580
  if (value.trim().length > 0) {
403
- const n = Number(value);
404
- if (Number.isFinite(n) && String(n) === value.trim())
405
- return n;
581
+ const n2 = Number(value);
582
+ if (Number.isFinite(n2) && String(n2) === value.trim())
583
+ return n2;
406
584
  }
407
585
  return value;
408
586
  }
@@ -13987,17 +14165,17 @@ var ZodArray = /* @__PURE__ */ $constructor("ZodArray", (inst, def) => {
13987
14165
  inst._zod.processJSONSchema = (ctx, json2, params) => arrayProcessor(inst, ctx, json2, params);
13988
14166
  inst.element = def.element;
13989
14167
  _installLazyMethods(inst, "ZodArray", {
13990
- min(n, params) {
13991
- return this.check(_minLength(n, params));
14168
+ min(n2, params) {
14169
+ return this.check(_minLength(n2, params));
13992
14170
  },
13993
14171
  nonempty(params) {
13994
14172
  return this.check(_minLength(1, params));
13995
14173
  },
13996
- max(n, params) {
13997
- return this.check(_maxLength(n, params));
14174
+ max(n2, params) {
14175
+ return this.check(_maxLength(n2, params));
13998
14176
  },
13999
- length(n, params) {
14000
- return this.check(_length(n, params));
14177
+ length(n2, params) {
14178
+ return this.check(_length(n2, params));
14001
14179
  },
14002
14180
  unwrap() {
14003
14181
  return this.element;
@@ -15068,12 +15246,12 @@ function convertSchema(schema, ctx) {
15068
15246
  let baseSchema = convertBaseSchema(schema, ctx);
15069
15247
  const hasExplicitType = schema.type || schema.enum !== void 0 || schema.const !== void 0;
15070
15248
  if (schema.anyOf && Array.isArray(schema.anyOf)) {
15071
- const options = schema.anyOf.map((s) => convertSchema(s, ctx));
15249
+ const options = schema.anyOf.map((s2) => convertSchema(s2, ctx));
15072
15250
  const anyOfUnion = z.union(options);
15073
15251
  baseSchema = hasExplicitType ? z.intersection(baseSchema, anyOfUnion) : anyOfUnion;
15074
15252
  }
15075
15253
  if (schema.oneOf && Array.isArray(schema.oneOf)) {
15076
- const options = schema.oneOf.map((s) => convertSchema(s, ctx));
15254
+ const options = schema.oneOf.map((s2) => convertSchema(s2, ctx));
15077
15255
  const oneOfUnion = z.xor(options);
15078
15256
  baseSchema = hasExplicitType ? z.intersection(baseSchema, oneOfUnion) : oneOfUnion;
15079
15257
  }
@@ -15786,10 +15964,10 @@ function resolveTenancy(creds, env = process.env) {
15786
15964
  // dist/src/daemon/storage/config.js
15787
15965
  var DEFAULT_QUERY_TIMEOUT_MS = 1e4;
15788
15966
  var QueryTimeoutMs = external_exports.preprocess((raw) => {
15789
- const n = typeof raw === "number" ? raw : Number(raw);
15790
- if (!Number.isFinite(n))
15967
+ const n2 = typeof raw === "number" ? raw : Number(raw);
15968
+ if (!Number.isFinite(n2))
15791
15969
  return DEFAULT_QUERY_TIMEOUT_MS;
15792
- return Math.min(Math.max(0, Math.trunc(n)), 6e5);
15970
+ return Math.min(Math.max(0, Math.trunc(n2)), 6e5);
15793
15971
  }, external_exports.number());
15794
15972
  var StorageConfigSchema = external_exports.object({
15795
15973
  /** DeepLake HTTP query endpoint, e.g. https://api.deeplake.ai. */
@@ -15877,8 +16055,8 @@ function pickString(value) {
15877
16055
  return typeof value === "string" && value.length > 0 ? value : void 0;
15878
16056
  }
15879
16057
  function pickNumber(value) {
15880
- const n = typeof value === "number" ? value : Number(value);
15881
- return Number.isFinite(n) ? n : void 0;
16058
+ const n2 = typeof value === "number" ? value : Number(value);
16059
+ return Number.isFinite(n2) ? n2 : void 0;
15882
16060
  }
15883
16061
  function pickBool(value) {
15884
16062
  return typeof value === "boolean" ? value : void 0;
@@ -16292,7 +16470,7 @@ var STORAGE_VERB_ROUTES = Object.freeze({
16292
16470
  function subcommandOf(argv) {
16293
16471
  return argv.find((a) => !a.startsWith("--")) ?? "";
16294
16472
  }
16295
- function flagValue2(argv, flag) {
16473
+ function flagValue3(argv, flag) {
16296
16474
  const idx = argv.indexOf(flag);
16297
16475
  if (idx < 0)
16298
16476
  return void 0;
@@ -16315,7 +16493,7 @@ function buildSkillRequest(argv) {
16315
16493
  }
16316
16494
  if (sub === "scope") {
16317
16495
  const scope = rest[1] ?? "";
16318
- const users = (flagValue2(argv, "--users") ?? "").split(",").map((u) => u.trim()).filter((u) => u.length > 0);
16496
+ const users = (flagValue3(argv, "--users") ?? "").split(",").map((u) => u.trim()).filter((u) => u.length > 0);
16319
16497
  const force = argv.includes("--force");
16320
16498
  return { method: "POST", path: "/api/skills/scope", body: { scope, users, force } };
16321
16499
  }
@@ -16344,14 +16522,14 @@ function stripFlagPair(argv, flag) {
16344
16522
  }
16345
16523
  function buildRememberRequest(argv) {
16346
16524
  const content = stripFlagPair(argv, "--type").filter((a) => !a.startsWith("--")).join(" ");
16347
- const type = flagValue2(argv, "--type");
16525
+ const type = flagValue3(argv, "--type");
16348
16526
  const body = { content };
16349
16527
  if (type !== void 0 && isMemoryType(type))
16350
16528
  body.type = type;
16351
16529
  return { method: "POST", path: "/api/memories", body };
16352
16530
  }
16353
16531
  function rememberTypeError(argv) {
16354
- const type = flagValue2(argv, "--type");
16532
+ const type = flagValue3(argv, "--type");
16355
16533
  if (type === void 0 || isMemoryType(type))
16356
16534
  return null;
16357
16535
  return [
@@ -16507,7 +16685,7 @@ function canonicalizeRemote(rawRemote) {
16507
16685
  return "";
16508
16686
  let path = pathPart.replace(/\/+$/, "");
16509
16687
  path = path.replace(/\.git$/i, "");
16510
- const segments = path.split("/").map((s) => s.trim().toLowerCase()).filter((s) => s.length > 0);
16688
+ const segments = path.split("/").map((s2) => s2.trim().toLowerCase()).filter((s2) => s2.length > 0);
16511
16689
  if (segments.length === 0)
16512
16690
  return "";
16513
16691
  return `${host}/${segments.join("/")}`;
@@ -16804,6 +16982,11 @@ async function start(deps, out) {
16804
16982
  out("daemon: started on 127.0.0.1:3850.");
16805
16983
  return { exitCode: 0 };
16806
16984
  }
16985
+ const status3 = await deps.lifecycle.status();
16986
+ if (status3.running) {
16987
+ out(`daemon: starting \u2014 the process is up (pid ${status3.pid ?? "?"}) but has not answered /health within the start budget; it is likely still warming up. Re-check with \`honeycomb daemon status\`.`);
16988
+ return { exitCode: 0 };
16989
+ }
16807
16990
  out("daemon: failed to start (did not become reachable on 127.0.0.1:3850).");
16808
16991
  return { exitCode: 1 };
16809
16992
  }
@@ -17042,7 +17225,7 @@ function buildAllowedProperties(input) {
17042
17225
  }
17043
17226
  var systemTelemetryClock = () => (/* @__PURE__ */ new Date()).toISOString();
17044
17227
  var DEFAULT_EMIT_TIMEOUT_MS = 2e3;
17045
- var HONEYCOMB_VERSION = true ? "0.1.4" : "0.0.0-dev";
17228
+ var HONEYCOMB_VERSION = true ? "0.1.6" : "0.0.0-dev";
17046
17229
  async function emitTelemetry(event, opts, deps = {}) {
17047
17230
  const env = deps.env ?? process.env;
17048
17231
  const key = deps.posthogKey ?? POSTHOG_KEY;
@@ -17185,7 +17368,7 @@ function renderGlassBoxText(view) {
17185
17368
  // dist/src/shared/constants.js
17186
17369
  var DAEMON_PORT = 3850;
17187
17370
  var DAEMON_HOST = "127.0.0.1";
17188
- var HONEYCOMB_VERSION2 = true ? "0.1.4" : "0.0.0-dev";
17371
+ var HONEYCOMB_VERSION2 = true ? "0.1.6" : "0.0.0-dev";
17189
17372
  var PRODUCT_SLUG = "honeycomb";
17190
17373
 
17191
17374
  // dist/src/commands/install.js
@@ -17394,6 +17577,9 @@ async function dispatchStorage(inv, deps) {
17394
17577
  if (inv.verb === "maintenance") {
17395
17578
  return runMaintenanceVerb(inv.argv, deps);
17396
17579
  }
17580
+ if (inv.verb === "memory") {
17581
+ return runMemoryVerb(inv.argv, deps, inv.flags.json);
17582
+ }
17397
17583
  if (inv.verb === "settings") {
17398
17584
  return runSettingsVerb(inv.argv, deps);
17399
17585
  }
@@ -19451,8 +19637,8 @@ function parsePluginEnabled(listOutput, name) {
19451
19637
  }
19452
19638
  return false;
19453
19639
  }
19454
- function escapeRegExp(s) {
19455
- return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
19640
+ function escapeRegExp(s2) {
19641
+ return s2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
19456
19642
  }
19457
19643
  function createClaudePluginRunner(binary = "claude") {
19458
19644
  function invoke(args) {
@@ -19724,7 +19910,7 @@ function buildKpisView(view) {
19724
19910
  return { kind: "metric", title: "KPIs", rows, data: view };
19725
19911
  }
19726
19912
  function buildSessionsView(view) {
19727
- const rows = view.sessions.map((s) => `${s.sessionId} \xB7 ${s.project} \xB7 ${s.startedAt} \xB7 ${s.eventCount} events \xB7 ${s.status}`);
19913
+ const rows = view.sessions.map((s2) => `${s2.sessionId} \xB7 ${s2.project} \xB7 ${s2.startedAt} \xB7 ${s2.eventCount} events \xB7 ${s2.status}`);
19728
19914
  return { kind: "table", title: "Sessions", rows, data: view.sessions };
19729
19915
  }
19730
19916
  function buildSettingsView(view) {
@@ -19754,7 +19940,7 @@ function buildRulesView(view) {
19754
19940
  return { kind: "table", title: "Rules", rows, data: view.rules };
19755
19941
  }
19756
19942
  function buildSkillSyncView(view) {
19757
- const rows = view.skills.map((s) => `${s.name} \xB7 ${s.scope} \xB7 ${s.syncState}`);
19943
+ const rows = view.skills.map((s2) => `${s2.name} \xB7 ${s2.scope} \xB7 ${s2.syncState}`);
19758
19944
  return { kind: "panel", title: "Skill-sync", rows, data: view.skills };
19759
19945
  }
19760
19946
 
@@ -19859,7 +20045,7 @@ function resolveDaemonEntry() {
19859
20045
  const devSibling = resolve7(here, "..", "..", "..", "daemon", "index.js");
19860
20046
  return process.env.HONEYCOMB_DAEMON_ENTRY ?? bundledSibling ?? devSibling;
19861
20047
  }
19862
- var DEFAULT_START_TIMEOUT_MS = 8e3;
20048
+ var DEFAULT_START_TIMEOUT_MS = 45e3;
19863
20049
  var START_POLL_INTERVAL_MS = 150;
19864
20050
  function runtimeDir() {
19865
20051
  return join12(homedir12(), ".honeycomb");