@legioncodeinc/honeycomb 0.1.8 → 0.1.10

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.
@@ -0,0 +1,41 @@
1
+ // dist/src/daemon/restart-helper.js
2
+ import { spawn } from "node:child_process";
3
+ var port = Number(process.env.HONEYCOMB_RESTART_PORT ?? "3850");
4
+ var entry = process.env.HONEYCOMB_RESTART_ENTRY ?? "";
5
+ var POLL_INTERVAL_MS = 200;
6
+ var MAX_WAIT_MS = 3e4;
7
+ var POLL_TIMEOUT_MS = 1e3;
8
+ var LOCK_RELEASE_GRACE_MS = 800;
9
+ var healthUrl = `http://127.0.0.1:${Number.isFinite(port) && port > 0 ? port : 3850}/health`;
10
+ async function stillUp() {
11
+ const ac = new AbortController();
12
+ const timer = setTimeout(() => ac.abort(), POLL_TIMEOUT_MS);
13
+ try {
14
+ const res = await fetch(healthUrl, { method: "GET", signal: ac.signal });
15
+ return res.ok;
16
+ } catch (error) {
17
+ return error instanceof Error && error.name === "AbortError";
18
+ } finally {
19
+ clearTimeout(timer);
20
+ }
21
+ }
22
+ function sleep(ms) {
23
+ return new Promise((r) => {
24
+ const t = setTimeout(r, ms);
25
+ t.unref?.();
26
+ });
27
+ }
28
+ async function main() {
29
+ if (entry === "")
30
+ return;
31
+ const deadline = Date.now() + MAX_WAIT_MS;
32
+ while (Date.now() < deadline) {
33
+ if (!await stillUp())
34
+ break;
35
+ await sleep(POLL_INTERVAL_MS);
36
+ }
37
+ await sleep(LOCK_RELEASE_GRACE_MS);
38
+ const child = spawn(process.execPath, [entry], { detached: true, stdio: "ignore" });
39
+ child.unref();
40
+ }
41
+ void main();
@@ -2,7 +2,7 @@
2
2
  import { createServer } from "node:http";
3
3
 
4
4
  // dist/src/shared/constants.js
5
- var HONEYCOMB_VERSION = true ? "0.1.8" : "0.0.0-dev";
5
+ var HONEYCOMB_VERSION = true ? "0.1.10" : "0.0.0-dev";
6
6
 
7
7
  // dist/embeddings/src/index.js
8
8
  var EMBED_DIMS = 768;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "honeycomb",
3
3
  "description": "Honeycomb — persistent memory for Claude Code sessions via the local Honeycomb daemon",
4
- "version": "0.1.8",
4
+ "version": "0.1.10",
5
5
  "author": {
6
6
  "name": "Honeycomb"
7
7
  },
@@ -92,12 +92,14 @@ function nestedString(raw, a, b) {
92
92
  function userMessageData(text) {
93
93
  return { kind: "user_message", text };
94
94
  }
95
- function assistantMessageData(text, usage) {
95
+ function assistantMessageData(text, usage, model) {
96
96
  const normalized = usage !== void 0 ? compactUsage(usage) : void 0;
97
+ const trimmedModel = typeof model === "string" ? model.trim() : "";
97
98
  return {
98
99
  kind: "assistant_message",
99
100
  text,
100
- ...normalized !== void 0 ? { usage: normalized } : {}
101
+ ...normalized !== void 0 ? { usage: normalized } : {},
102
+ ...trimmedModel !== "" ? { model: trimmedModel } : {}
101
103
  };
102
104
  }
103
105
  function compactUsage(usage) {
@@ -167,6 +169,112 @@ function preToolData(tool, fields) {
167
169
  };
168
170
  }
169
171
 
172
+ // dist/src/hooks/claude-code/transcript.js
173
+ import { readFileSync } from "node:fs";
174
+ function parseTurnUsage(jsonlText) {
175
+ const entries = parseEntries(jsonlText);
176
+ let lastUserIndex = -1;
177
+ for (let i = 0; i < entries.length; i++) {
178
+ if (entryType(entries[i]) === "user")
179
+ lastUserIndex = i;
180
+ }
181
+ const totals = new TurnTotals();
182
+ let lastModel;
183
+ let sawAssistant = false;
184
+ for (let i = lastUserIndex + 1; i < entries.length; i++) {
185
+ const entry = entries[i];
186
+ if (entryType(entry) !== "assistant")
187
+ continue;
188
+ sawAssistant = true;
189
+ totals.add(messageOf(entry));
190
+ const model = modelOf(entry);
191
+ if (model !== void 0)
192
+ lastModel = model;
193
+ }
194
+ if (!sawAssistant)
195
+ return {};
196
+ const usage = totals.toUsage();
197
+ return {
198
+ ...lastModel !== void 0 ? { model: lastModel } : {},
199
+ ...usage !== void 0 ? { usage } : {}
200
+ };
201
+ }
202
+ function readTranscriptTurnUsage(transcriptPath) {
203
+ if (transcriptPath.length === 0)
204
+ return {};
205
+ let text;
206
+ try {
207
+ text = readFileSync(transcriptPath, "utf8");
208
+ } catch {
209
+ return {};
210
+ }
211
+ return parseTurnUsage(text);
212
+ }
213
+ function parseEntries(jsonlText) {
214
+ const out = [];
215
+ for (const line of jsonlText.split("\n")) {
216
+ const trimmed = line.trim();
217
+ if (trimmed.length === 0)
218
+ continue;
219
+ let parsed;
220
+ try {
221
+ parsed = JSON.parse(trimmed);
222
+ } catch {
223
+ continue;
224
+ }
225
+ if (parsed !== null && typeof parsed === "object")
226
+ out.push(parsed);
227
+ }
228
+ return out;
229
+ }
230
+ function entryType(entry) {
231
+ return typeof entry.type === "string" ? entry.type : "";
232
+ }
233
+ function messageOf(entry) {
234
+ const message = entry.message;
235
+ return message !== null && typeof message === "object" ? message : {};
236
+ }
237
+ function modelOf(entry) {
238
+ const model = messageOf(entry).model;
239
+ return typeof model === "string" && model.length > 0 ? model : void 0;
240
+ }
241
+ var TurnTotals = class {
242
+ input;
243
+ output;
244
+ cacheRead;
245
+ cacheCreation;
246
+ /** Fold one assistant `message.usage` block's counts into the running totals (absent counts skipped). */
247
+ add(message) {
248
+ const usage = message.usage;
249
+ const block = usage !== null && typeof usage === "object" ? usage : {};
250
+ this.input = addCount(this.input, readCount2(block, "input_tokens"));
251
+ this.output = addCount(this.output, readCount2(block, "output_tokens"));
252
+ this.cacheRead = addCount(this.cacheRead, readCount2(block, "cache_read_input_tokens"));
253
+ this.cacheCreation = addCount(this.cacheCreation, readCount2(block, "cache_creation_input_tokens"));
254
+ }
255
+ /** Compact the totals into a {@link NormalizedTurnUsage}, or `undefined` when every bucket stayed absent. */
256
+ toUsage() {
257
+ const usage = {
258
+ ...this.input !== void 0 ? { input: this.input } : {},
259
+ ...this.output !== void 0 ? { output: this.output } : {},
260
+ ...this.cacheRead !== void 0 ? { cacheRead: this.cacheRead } : {},
261
+ ...this.cacheCreation !== void 0 ? { cacheCreation: this.cacheCreation } : {}
262
+ };
263
+ return Object.keys(usage).length > 0 ? usage : void 0;
264
+ }
265
+ };
266
+ function addCount(running, addend) {
267
+ if (addend === void 0)
268
+ return running;
269
+ return (running ?? 0) + addend;
270
+ }
271
+ function readCount2(block, key) {
272
+ const value = block[key];
273
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0)
274
+ return void 0;
275
+ return value;
276
+ }
277
+
170
278
  // dist/src/hooks/claude-code/shim.js
171
279
  var CLAUDE_CODE_EVENT_MAP = {
172
280
  SessionStart: "session-start",
@@ -181,7 +289,7 @@ var CLAUDE_CODE_CONTEXT_CHANNEL = "model-only";
181
289
  var CLAUDE_CODE_RUNTIME_PATH = "legacy";
182
290
  var CLAUDE_CODE_HOST_CLI = { bin: "claude", args: ["-p"] };
183
291
  var CLAUDE_CODE_REFERENCES = "references/claude-code/";
184
- function claudeCodeExtractData(raw, logical) {
292
+ function claudeCodeExtractData(raw, logical, meta3) {
185
293
  switch (logical) {
186
294
  case "session-start":
187
295
  return sessionStartData(pickString(raw, "source") || "startup");
@@ -195,8 +303,11 @@ function claudeCodeExtractData(raw, logical) {
195
303
  });
196
304
  case "tool_call":
197
305
  return toolCallData(pickString(raw, "tool_name", "tool"), nested(raw, "tool_input"), nested(raw, "tool_response"));
198
- case "assistant_message":
199
- return assistantMessageData(pickString(raw, "text", "message"), extractTurnUsage(raw));
306
+ case "assistant_message": {
307
+ const fromTranscript = readTranscriptTurnUsage(meta3.path ?? "");
308
+ const usage = fromTranscript.usage ?? extractTurnUsage(raw);
309
+ return assistantMessageData(pickString(raw, "text", "message"), usage, fromTranscript.model);
310
+ }
200
311
  case "session-end":
201
312
  return sessionEndData(pickString(raw, "reason") || "Stop");
202
313
  default:
@@ -211,9 +322,8 @@ function createClaudeCodeShim() {
211
322
  hostCli: CLAUDE_CODE_HOST_CLI,
212
323
  references: CLAUDE_CODE_REFERENCES,
213
324
  eventMap: CLAUDE_CODE_EVENT_MAP,
214
- extractData(raw, logical, _meta) {
215
- void _meta;
216
- return claudeCodeExtractData(raw, logical);
325
+ extractData(raw, logical, meta3) {
326
+ return claudeCodeExtractData(raw, logical, meta3);
217
327
  }
218
328
  });
219
329
  }
@@ -327,7 +437,7 @@ function createNotificationsPipeline(deps) {
327
437
  }
328
438
 
329
439
  // dist/src/notifications/state.js
330
- import { closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
440
+ import { closeSync, existsSync, mkdirSync, openSync, readFileSync as readFileSync2, renameSync, unlinkSync, writeFileSync } from "node:fs";
331
441
  import { homedir } from "node:os";
332
442
  import { join } from "node:path";
333
443
  var STATE_FILE_NAME = "notifications-state.json";
@@ -349,7 +459,7 @@ var nodeStateFs = {
349
459
  return existsSync(path);
350
460
  },
351
461
  readText(path) {
352
- return readFileSync(path, "utf-8");
462
+ return readFileSync2(path, "utf-8");
353
463
  },
354
464
  writeText(path, contents) {
355
465
  writeFileSync(path, contents, "utf-8");
@@ -525,7 +635,7 @@ async function parseJson(res) {
525
635
  }
526
636
 
527
637
  // dist/src/hooks/shared/credential-reader.js
528
- import { existsSync as existsSync2, readFileSync as readFileSync2 } from "node:fs";
638
+ import { existsSync as existsSync2, readFileSync as readFileSync3 } from "node:fs";
529
639
  import { homedir as homedir2 } from "node:os";
530
640
  import { join as join2 } from "node:path";
531
641
  var CREDENTIALS_DIR_NAME = ".deeplake";
@@ -559,7 +669,7 @@ function readFileCredential(path) {
559
669
  return void 0;
560
670
  let parsed;
561
671
  try {
562
- parsed = JSON.parse(readFileSync2(path, "utf8"));
672
+ parsed = JSON.parse(readFileSync3(path, "utf8"));
563
673
  } catch {
564
674
  return void 0;
565
675
  }
@@ -683,7 +793,7 @@ var IDENTITY_ADAPTER = Object.freeze({
683
793
  });
684
794
 
685
795
  // dist/src/daemon-client/assets/install.js
686
- import { existsSync as existsSync3, mkdirSync as mkdirSync2, readFileSync as readFileSync3, renameSync as renameSync2, rmSync, writeFileSync as writeFileSync2 } from "node:fs";
796
+ import { existsSync as existsSync3, mkdirSync as mkdirSync2, readFileSync as readFileSync4, renameSync as renameSync2, rmSync, writeFileSync as writeFileSync2 } from "node:fs";
687
797
  import { homedir as homedir3 } from "node:os";
688
798
  import { dirname, join as join3, resolve } from "node:path";
689
799
  var ASSETS_API_BASE = "/api/assets";
@@ -847,7 +957,7 @@ function retract(dir, _file2) {
847
957
  }
848
958
  function readLocalMarker(dir) {
849
959
  try {
850
- const raw = readFileSync3(join3(dir, ASSET_MARKER), "utf-8");
960
+ const raw = readFileSync4(join3(dir, ASSET_MARKER), "utf-8");
851
961
  const parsed = JSON.parse(raw);
852
962
  if (typeof parsed !== "object" || parsed === null)
853
963
  return null;
@@ -970,7 +1080,7 @@ function asPulledAsset(value) {
970
1080
  }
971
1081
 
972
1082
  // dist/src/daemon-client/skillify/install.js
973
- import { existsSync as existsSync4, lstatSync, mkdirSync as mkdirSync3, readFileSync as readFileSync4, readlinkSync, renameSync as renameSync3, rmSync as rmSync2, symlinkSync, unlinkSync as unlinkSync2, writeFileSync as writeFileSync3 } from "node:fs";
1083
+ import { existsSync as existsSync4, lstatSync, mkdirSync as mkdirSync3, readFileSync as readFileSync5, readlinkSync, renameSync as renameSync3, rmSync as rmSync2, symlinkSync, unlinkSync as unlinkSync2, writeFileSync as writeFileSync3 } from "node:fs";
974
1084
  import { homedir as homedir4 } from "node:os";
975
1085
  import { dirname as dirname2, join as join4, resolve as resolve2 } from "node:path";
976
1086
  var AUTOPULL_DISABLED_ENV = "HONEYCOMB_AUTOPULL_DISABLED";
@@ -978,7 +1088,7 @@ var AUTOPULL_TIMEOUT_MS = 5e3;
978
1088
  var CLAUDE_SKILLS = join4(".claude", "skills");
979
1089
 
980
1090
  // dist/src/daemon-client/skillify/config.js
981
- import { mkdirSync as mkdirSync4, readFileSync as readFileSync5, writeFileSync as writeFileSync4 } from "node:fs";
1091
+ import { mkdirSync as mkdirSync4, readFileSync as readFileSync6, writeFileSync as writeFileSync4 } from "node:fs";
982
1092
  import { homedir as homedir5 } from "node:os";
983
1093
  import { dirname as dirname3, join as join5 } from "node:path";
984
1094
  var DEFAULT_CONFIG = Object.freeze({
@@ -988,12 +1098,12 @@ var DEFAULT_CONFIG = Object.freeze({
988
1098
  });
989
1099
 
990
1100
  // dist/src/daemon-client/skillify/manifest.js
991
- import { mkdirSync as mkdirSync5, readFileSync as readFileSync7, renameSync as renameSync5, writeFileSync as writeFileSync5 } from "node:fs";
1101
+ import { mkdirSync as mkdirSync5, readFileSync as readFileSync8, renameSync as renameSync5, writeFileSync as writeFileSync5 } from "node:fs";
992
1102
  import { homedir as homedir6 } from "node:os";
993
1103
  import { dirname as dirname4, join as join6 } from "node:path";
994
1104
 
995
1105
  // dist/src/daemon-client/skillify/migrate-manifest.js
996
- import { existsSync as existsSync5, readFileSync as readFileSync6, renameSync as renameSync4 } from "node:fs";
1106
+ import { existsSync as existsSync5, readFileSync as readFileSync7, renameSync as renameSync4 } from "node:fs";
997
1107
 
998
1108
  // dist/src/daemon-client/skillify/manifest.js
999
1109
  var SKILL_ROW_DEFAULTS = Object.freeze({
@@ -1011,38 +1121,52 @@ var SKILL_ROW_DEFAULTS = Object.freeze({
1011
1121
  });
1012
1122
 
1013
1123
  // dist/src/commands/contracts.js
1124
+ var VERB_GROUPS = Object.freeze([
1125
+ { key: "memory", label: "Memory & recall" },
1126
+ { key: "knowledge", label: "Knowledge & skills" },
1127
+ { key: "agents", label: "Agents, routing & config" },
1128
+ { key: "account", label: "Account & workspaces" },
1129
+ { key: "system", label: "Setup & system" }
1130
+ ]);
1014
1131
  var VERB_TABLE = Object.freeze([
1015
- { verb: "setup", cls: "local", summary: "detect assistants, wire hooks, bring up the daemon" },
1016
- { verb: "install", cls: "local", summary: "bring up the daemon (health-gated) + open the dashboard (PRD-050a)" },
1017
- { verb: "status", cls: "local", summary: "daemon connectivity + login + D1\u2013D5 environment health" },
1018
- { verb: "daemon", cls: "local", summary: "start | stop | status the loopback daemon (3850)" },
1019
- { verb: "dashboard", cls: "local", summary: "launch the daemon-served dashboard (020b)" },
1020
- { verb: "telemetry", cls: "local", summary: "show exactly what adoption telemetry has been / would be sent (--show, PRD-050e)" },
1021
- { verb: "pollinate", cls: "storage", summary: "trigger a pollinating consolidation pass on the daemon (009/026)" },
1022
- { verb: "maintenance", cls: "storage", summary: "run version-history compaction over version-bumped tables (030)" },
1023
- { verb: "remember", cls: "storage", summary: "write a memory through the daemon (--type fact|convention|preference|decision|gotcha|reference)" },
1024
- { verb: "recall", cls: "storage", summary: "recall memories through the daemon" },
1025
- { verb: "memory", cls: "storage", summary: "lifecycle: conflicts (list/resolve), stale-refs (list), inspect <id> --lifecycle (058d)" },
1026
- { verb: "agent", cls: "storage", summary: "run an agent turn through the daemon" },
1027
- { verb: "ontology", cls: "storage", summary: "inspect/propose ontology changes through the daemon" },
1028
- { verb: "secret", cls: "storage", summary: "manage named secrets through the daemon" },
1029
- { verb: "settings", cls: "storage", summary: "get/set/list vault settings + provider\u2192model selector through the daemon" },
1030
- { verb: "asset", cls: "storage", summary: "register/promote/demote/style skills+agents through the tier\xD7style lattice (033)" },
1031
- { verb: "skill", cls: "storage", summary: "skillify scope/pull/unpull/force/promote through the daemon (promote = cross-project, 049c)" },
1032
- { verb: "skillify", cls: "storage", summary: "pull team skills from the daemon (016c)" },
1033
- { verb: "hook", cls: "local", summary: "inspect/wire harness hooks" },
1034
- { verb: "route", cls: "storage", summary: "manage inference routes through the daemon" },
1035
- { verb: "sources", cls: "storage", summary: "connect/index/purge sources through the daemon" },
1036
- { verb: "graph", cls: "storage", summary: "build/query the codebase graph through the daemon" },
1037
- { verb: "goal", cls: "storage", summary: "manage goals/KPIs through the daemon" },
1038
- { verb: "whoami", cls: "auth", summary: "show the authenticated user, org, and workspace (GET /me)" },
1039
- { verb: "org", cls: "auth", summary: "list/switch org (passthrough to the auth dispatcher)" },
1040
- { verb: "workspace", cls: "auth", summary: "list/switch/use workspace (passthrough to the auth dispatcher)" },
1041
- { verb: "workspaces", cls: "auth", summary: "list workspaces in the active org (alias of `workspace list`)" },
1042
- { verb: "project", cls: "auth", summary: "list/bind/use projects + show the resolved per-folder scope (049d)" },
1043
- { verb: "sessions", cls: "storage", summary: "list/prune captured sessions through the daemon" },
1044
- { verb: "uninstall", cls: "local", summary: "reverse only Honeycomb's changes" },
1045
- { verb: "update", cls: "local", summary: "self-update the CLI, daemon, and bundles" }
1132
+ // Memory & recall the product's core write/read/lifecycle surface.
1133
+ { verb: "remember", cls: "storage", group: "memory", summary: "write a memory through the daemon (--type fact|convention|preference|decision|gotcha|reference)" },
1134
+ { verb: "recall", cls: "storage", group: "memory", summary: "recall memories through the daemon" },
1135
+ { verb: "memory", cls: "storage", group: "memory", summary: "lifecycle: conflicts (list/resolve), stale-refs (list), inspect <id> --lifecycle (058d)" },
1136
+ { verb: "sessions", cls: "storage", group: "memory", summary: "list/prune captured sessions through the daemon" },
1137
+ { verb: "pollinate", cls: "storage", group: "memory", summary: "trigger a pollinating consolidation pass on the daemon (009/026)" },
1138
+ { verb: "maintenance", cls: "storage", group: "memory", summary: "run version-history compaction over version-bumped tables (030)" },
1139
+ // Knowledge & skills — skills, assets, ontology, the codebase graph, and goals.
1140
+ { verb: "skill", cls: "storage", group: "knowledge", summary: "skillify scope/pull/unpull/force/promote through the daemon (promote = cross-project, 049c)" },
1141
+ { verb: "skillify", cls: "storage", group: "knowledge", summary: "pull team skills from the daemon (016c)" },
1142
+ { verb: "asset", cls: "storage", group: "knowledge", summary: "register/promote/demote/style skills+agents through the tier\xD7style lattice (033)" },
1143
+ { verb: "ontology", cls: "storage", group: "knowledge", summary: "inspect/propose ontology changes through the daemon" },
1144
+ { verb: "graph", cls: "storage", group: "knowledge", summary: "build/query the codebase graph through the daemon" },
1145
+ { verb: "sources", cls: "storage", group: "knowledge", summary: "connect/index/purge sources through the daemon" },
1146
+ { verb: "goal", cls: "storage", group: "knowledge", summary: "manage goals/KPIs through the daemon" },
1147
+ // Agents, routing & config agent turns, inference routes, secrets, and vault settings.
1148
+ { verb: "agent", cls: "storage", group: "agents", summary: "run an agent turn through the daemon" },
1149
+ { verb: "route", cls: "storage", group: "agents", summary: "manage inference routes through the daemon" },
1150
+ { verb: "secret", cls: "storage", group: "agents", summary: "manage named secrets through the daemon" },
1151
+ { verb: "settings", cls: "storage", group: "agents", summary: "get/set/list vault settings + provider\u2192model selector through the daemon" },
1152
+ // Account & workspaces — auth, identity, and the org/workspace/project scope surface.
1153
+ { verb: "login", cls: "auth", group: "account", summary: "authenticate via device flow, or --token <key> for headless (023)" },
1154
+ { verb: "logout", cls: "auth", group: "account", summary: "remove the shared credentials and sign out (023)" },
1155
+ { verb: "whoami", cls: "auth", group: "account", summary: "show the authenticated user, org, and workspace (GET /me)" },
1156
+ { verb: "org", cls: "auth", group: "account", summary: "list/switch org (passthrough to the auth dispatcher)" },
1157
+ { verb: "workspace", cls: "auth", group: "account", summary: "list/switch/use workspace (passthrough to the auth dispatcher)" },
1158
+ { verb: "workspaces", cls: "auth", group: "account", summary: "list workspaces in the active org (alias of `workspace list`)" },
1159
+ { verb: "project", cls: "auth", group: "account", summary: "list/bind/use projects + show the resolved per-folder scope (049d)" },
1160
+ // Setup & system install/onboard, daemon lifecycle, dashboard, hooks, telemetry, update.
1161
+ { verb: "setup", cls: "local", group: "system", summary: "detect assistants, wire hooks, bring up the daemon" },
1162
+ { verb: "install", cls: "local", group: "system", summary: "bring up the daemon (health-gated) + open the dashboard (PRD-050a)" },
1163
+ { verb: "status", cls: "local", group: "system", summary: "daemon connectivity + login + D1\u2013D5 environment health" },
1164
+ { verb: "daemon", cls: "local", group: "system", summary: "start | stop | status the loopback daemon (3850)" },
1165
+ { verb: "dashboard", cls: "local", group: "system", summary: "launch the daemon-served dashboard (020b)" },
1166
+ { verb: "hook", cls: "local", group: "system", summary: "inspect/wire harness hooks" },
1167
+ { verb: "telemetry", cls: "local", group: "system", summary: "show exactly what adoption telemetry has been / would be sent (--show, PRD-050e)" },
1168
+ { verb: "update", cls: "local", group: "system", summary: "self-update the CLI, daemon, and bundles" },
1169
+ { verb: "uninstall", cls: "local", group: "system", summary: "reverse only Honeycomb's changes" }
1046
1170
  ]);
1047
1171
  var DEFAULT_GLOBAL_FLAGS = Object.freeze({
1048
1172
  help: false,
@@ -1095,7 +1219,7 @@ function createLoopbackDaemonClient(options = {}) {
1095
1219
 
1096
1220
  // dist/src/daemon/runtime/assets/device.js
1097
1221
  import { randomUUID } from "node:crypto";
1098
- import { mkdirSync as mkdirSync6, readFileSync as readFileSync8, writeFileSync as writeFileSync6 } from "node:fs";
1222
+ import { mkdirSync as mkdirSync6, readFileSync as readFileSync9, writeFileSync as writeFileSync6 } from "node:fs";
1099
1223
  import { homedir as homedir7, hostname } from "node:os";
1100
1224
  import { dirname as dirname5, join as join7 } from "node:path";
1101
1225
  function honeycombHomeDir(homeDir = homedir7()) {
@@ -1125,7 +1249,7 @@ function loadOrCreateDevice(options = {}) {
1125
1249
  }
1126
1250
  function readDeviceRecord(filePath) {
1127
1251
  try {
1128
- const parsed = JSON.parse(readFileSync8(filePath, "utf-8"));
1252
+ const parsed = JSON.parse(readFileSync9(filePath, "utf-8"));
1129
1253
  if (typeof parsed !== "object" || parsed === null)
1130
1254
  return null;
1131
1255
  const r = parsed;
@@ -15871,7 +15995,7 @@ async function runCaptureGuarded(env, ctx, capture, onError) {
15871
15995
 
15872
15996
  // dist/src/hooks/shared/project-resolver.js
15873
15997
  import { execFileSync } from "node:child_process";
15874
- import { existsSync as existsSync6, mkdirSync as mkdirSync7, readFileSync as readFileSync9, writeFileSync as writeFileSync7 } from "node:fs";
15998
+ import { existsSync as existsSync6, mkdirSync as mkdirSync7, readFileSync as readFileSync10, writeFileSync as writeFileSync7 } from "node:fs";
15875
15999
  import { homedir as homedir8 } from "node:os";
15876
16000
  import { dirname as dirname6, join as join8, resolve as resolve3, sep } from "node:path";
15877
16001
  var UNSORTED_PROJECT_ID = "__unsorted__";
@@ -15907,7 +16031,7 @@ function loadProjectsCache(dir) {
15907
16031
  return emptyProjectsCache();
15908
16032
  let raw;
15909
16033
  try {
15910
- raw = readFileSync9(path, "utf8");
16034
+ raw = readFileSync10(path, "utf8");
15911
16035
  } catch {
15912
16036
  return emptyProjectsCache();
15913
16037
  }