@legioncodeinc/honeycomb 0.1.5 → 0.1.7

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.5"
8
+ "version": "0.1.7"
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.5",
14
+ "version": "0.1.7",
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.5",
4
+ "version": "0.1.7",
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. */
@@ -15803,7 +15981,17 @@ var StorageConfigSchema = external_exports.object({
15803
15981
  /** Per-statement timeout, clamped non-negative. */
15804
15982
  queryTimeoutMs: QueryTimeoutMs.default(DEFAULT_QUERY_TIMEOUT_MS),
15805
15983
  /** SQL tracing gate (FR-6). Evaluated at call time, see client.ts. */
15806
- traceSql: external_exports.boolean().default(false)
15984
+ traceSql: external_exports.boolean().default(false),
15985
+ /**
15986
+ * Query-meter persistence gate (PRD-062a). RESERVED, NOT YET IMPLEMENTED. The
15987
+ * query meter's default posture is in-memory + structured-log only and adds
15988
+ * ZERO DeepLake queries; persisting per-source counts to the existing
15989
+ * `telemetry_counters` tenant group is a later, separate concern and would add
15990
+ * write cost, so it is gated behind this flag. Today the flag is parsed and
15991
+ * carried but nothing reads it for behavior — wiring persistence is out of
15992
+ * scope for this sub-PRD (it must not make the meter itself a write-cost driver).
15993
+ */
15994
+ queryMeterPersist: external_exports.boolean().default(false)
15807
15995
  });
15808
15996
 
15809
15997
  // dist/src/daemon/storage/converge.js
@@ -15877,8 +16065,8 @@ function pickString(value) {
15877
16065
  return typeof value === "string" && value.length > 0 ? value : void 0;
15878
16066
  }
15879
16067
  function pickNumber(value) {
15880
- const n = typeof value === "number" ? value : Number(value);
15881
- return Number.isFinite(n) ? n : void 0;
16068
+ const n2 = typeof value === "number" ? value : Number(value);
16069
+ return Number.isFinite(n2) ? n2 : void 0;
15882
16070
  }
15883
16071
  function pickBool(value) {
15884
16072
  return typeof value === "boolean" ? value : void 0;
@@ -16292,7 +16480,7 @@ var STORAGE_VERB_ROUTES = Object.freeze({
16292
16480
  function subcommandOf(argv) {
16293
16481
  return argv.find((a) => !a.startsWith("--")) ?? "";
16294
16482
  }
16295
- function flagValue2(argv, flag) {
16483
+ function flagValue3(argv, flag) {
16296
16484
  const idx = argv.indexOf(flag);
16297
16485
  if (idx < 0)
16298
16486
  return void 0;
@@ -16315,7 +16503,7 @@ function buildSkillRequest(argv) {
16315
16503
  }
16316
16504
  if (sub === "scope") {
16317
16505
  const scope = rest[1] ?? "";
16318
- const users = (flagValue2(argv, "--users") ?? "").split(",").map((u) => u.trim()).filter((u) => u.length > 0);
16506
+ const users = (flagValue3(argv, "--users") ?? "").split(",").map((u) => u.trim()).filter((u) => u.length > 0);
16319
16507
  const force = argv.includes("--force");
16320
16508
  return { method: "POST", path: "/api/skills/scope", body: { scope, users, force } };
16321
16509
  }
@@ -16344,14 +16532,14 @@ function stripFlagPair(argv, flag) {
16344
16532
  }
16345
16533
  function buildRememberRequest(argv) {
16346
16534
  const content = stripFlagPair(argv, "--type").filter((a) => !a.startsWith("--")).join(" ");
16347
- const type = flagValue2(argv, "--type");
16535
+ const type = flagValue3(argv, "--type");
16348
16536
  const body = { content };
16349
16537
  if (type !== void 0 && isMemoryType(type))
16350
16538
  body.type = type;
16351
16539
  return { method: "POST", path: "/api/memories", body };
16352
16540
  }
16353
16541
  function rememberTypeError(argv) {
16354
- const type = flagValue2(argv, "--type");
16542
+ const type = flagValue3(argv, "--type");
16355
16543
  if (type === void 0 || isMemoryType(type))
16356
16544
  return null;
16357
16545
  return [
@@ -16507,7 +16695,7 @@ function canonicalizeRemote(rawRemote) {
16507
16695
  return "";
16508
16696
  let path = pathPart.replace(/\/+$/, "");
16509
16697
  path = path.replace(/\.git$/i, "");
16510
- const segments = path.split("/").map((s) => s.trim().toLowerCase()).filter((s) => s.length > 0);
16698
+ const segments = path.split("/").map((s2) => s2.trim().toLowerCase()).filter((s2) => s2.length > 0);
16511
16699
  if (segments.length === 0)
16512
16700
  return "";
16513
16701
  return `${host}/${segments.join("/")}`;
@@ -17047,7 +17235,7 @@ function buildAllowedProperties(input) {
17047
17235
  }
17048
17236
  var systemTelemetryClock = () => (/* @__PURE__ */ new Date()).toISOString();
17049
17237
  var DEFAULT_EMIT_TIMEOUT_MS = 2e3;
17050
- var HONEYCOMB_VERSION = true ? "0.1.5" : "0.0.0-dev";
17238
+ var HONEYCOMB_VERSION = true ? "0.1.7" : "0.0.0-dev";
17051
17239
  async function emitTelemetry(event, opts, deps = {}) {
17052
17240
  const env = deps.env ?? process.env;
17053
17241
  const key = deps.posthogKey ?? POSTHOG_KEY;
@@ -17075,8 +17263,8 @@ async function emitTelemetry(event, opts, deps = {}) {
17075
17263
  if (isReported(state, event))
17076
17264
  return { sent: false, skipped: "already_reported", properties };
17077
17265
  const distinctId = state.installId;
17078
- const ok = await postCapture(event, properties, distinctId, key, deps);
17079
- if (!ok)
17266
+ const ok2 = await postCapture(event, properties, distinctId, key, deps);
17267
+ if (!ok2)
17080
17268
  return { sent: false, skipped: "send_failed", properties };
17081
17269
  const clock = deps.clock ?? systemTelemetryClock;
17082
17270
  const at = clock();
@@ -17190,7 +17378,7 @@ function renderGlassBoxText(view) {
17190
17378
  // dist/src/shared/constants.js
17191
17379
  var DAEMON_PORT = 3850;
17192
17380
  var DAEMON_HOST = "127.0.0.1";
17193
- var HONEYCOMB_VERSION2 = true ? "0.1.5" : "0.0.0-dev";
17381
+ var HONEYCOMB_VERSION2 = true ? "0.1.7" : "0.0.0-dev";
17194
17382
  var PRODUCT_SLUG = "honeycomb";
17195
17383
 
17196
17384
  // dist/src/commands/install.js
@@ -17399,6 +17587,9 @@ async function dispatchStorage(inv, deps) {
17399
17587
  if (inv.verb === "maintenance") {
17400
17588
  return runMaintenanceVerb(inv.argv, deps);
17401
17589
  }
17590
+ if (inv.verb === "memory") {
17591
+ return runMemoryVerb(inv.argv, deps, inv.flags.json);
17592
+ }
17402
17593
  if (inv.verb === "settings") {
17403
17594
  return runSettingsVerb(inv.argv, deps);
17404
17595
  }
@@ -19456,8 +19647,8 @@ function parsePluginEnabled(listOutput, name) {
19456
19647
  }
19457
19648
  return false;
19458
19649
  }
19459
- function escapeRegExp(s) {
19460
- return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
19650
+ function escapeRegExp(s2) {
19651
+ return s2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
19461
19652
  }
19462
19653
  function createClaudePluginRunner(binary = "claude") {
19463
19654
  function invoke(args) {
@@ -19645,8 +19836,8 @@ function probeCli() {
19645
19836
  function probeCursorAgent() {
19646
19837
  try {
19647
19838
  const probe = process.platform === "win32" ? spawnSync2("where", ["cursor-agent"], { stdio: "ignore", windowsHide: true }) : spawnSync2("which", ["cursor-agent"], { stdio: "ignore", windowsHide: true });
19648
- const ok = probe.status === 0;
19649
- return ok ? { ok: true, detail: "on PATH" } : { ok: false, detail: "cursor-agent not on PATH" };
19839
+ const ok2 = probe.status === 0;
19840
+ return ok2 ? { ok: true, detail: "on PATH" } : { ok: false, detail: "cursor-agent not on PATH" };
19650
19841
  } catch (err) {
19651
19842
  return { ok: false, detail: err instanceof Error ? err.message : "probe failed" };
19652
19843
  }
@@ -19729,7 +19920,7 @@ function buildKpisView(view) {
19729
19920
  return { kind: "metric", title: "KPIs", rows, data: view };
19730
19921
  }
19731
19922
  function buildSessionsView(view) {
19732
- const rows = view.sessions.map((s) => `${s.sessionId} \xB7 ${s.project} \xB7 ${s.startedAt} \xB7 ${s.eventCount} events \xB7 ${s.status}`);
19923
+ const rows = view.sessions.map((s2) => `${s2.sessionId} \xB7 ${s2.project} \xB7 ${s2.startedAt} \xB7 ${s2.eventCount} events \xB7 ${s2.status}`);
19733
19924
  return { kind: "table", title: "Sessions", rows, data: view.sessions };
19734
19925
  }
19735
19926
  function buildSettingsView(view) {
@@ -19759,7 +19950,7 @@ function buildRulesView(view) {
19759
19950
  return { kind: "table", title: "Rules", rows, data: view.rules };
19760
19951
  }
19761
19952
  function buildSkillSyncView(view) {
19762
- const rows = view.skills.map((s) => `${s.name} \xB7 ${s.scope} \xB7 ${s.syncState}`);
19953
+ const rows = view.skills.map((s2) => `${s2.name} \xB7 ${s2.scope} \xB7 ${s2.syncState}`);
19763
19954
  return { kind: "panel", title: "Skill-sync", rows, data: view.skills };
19764
19955
  }
19765
19956