glimmervoid 0.44.0 → 0.44.1

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.
Files changed (23) hide show
  1. package/dist/bin/glimmervoid.js +8 -8
  2. package/dist/chunks/{adapters-DjDtNufj.js → adapters-B2IgKmuZ.js} +1 -1
  3. package/dist/chunks/{adapters-CSRTLFiZ.js → adapters-BsoXEvlZ.js} +2 -2
  4. package/dist/chunks/{agent-api-cli-ep_5T7Hx.js → agent-api-cli-B-QxkZAQ.js} +1 -1
  5. package/dist/chunks/{agent-api-cli-CVgij_62.js → agent-api-cli-DIl92JjQ.js} +1 -1
  6. package/dist/chunks/{agent-api-core-DmPT6Hc_.js → agent-api-core-BCFplxXu.js} +1 -1
  7. package/dist/chunks/{config-CGRYpcBQ.js → config-Dh4e-Mkv.js} +6 -0
  8. package/dist/chunks/{config-store-B1u3WA5t.js → config-store-CEsetno2.js} +51 -7
  9. package/dist/chunks/config-store-DVwdcnub.js +1 -0
  10. package/dist/chunks/{contracts-Fup4hhP9.js → contracts-dj-GFptp.js} +30 -6
  11. package/dist/chunks/{main-DPtmg7Bn.js → main-CA3ONCUS.js} +147 -32
  12. package/dist/chunks/{pair-cli-BwOTWShx.js → pair-cli-CWHMbInF.js} +2 -2
  13. package/dist/chunks/{remote-config-DWWnz5dP.js → remote-config-CtcoO10O.js} +1 -1
  14. package/dist/chunks/{settings-cli-C_owm3rw.js → settings-cli-DGOkkmW-.js} +4 -4
  15. package/dist/chunks/{settings-readout-core-C_JzSeF7.js → settings-readout-core-BVb6tTLq.js} +1 -1
  16. package/dist/chunks/{ssh-sign-cli-CDjUtDKa.js → ssh-sign-cli-BdvvBKkj.js} +1 -1
  17. package/dist/client/assets/index-BR-wN5UF.js +177 -0
  18. package/dist/client/assets/{index-o9J4_Orv.css → index-QxVyoSUP.css} +1 -1
  19. package/dist/client/index.html +5 -4
  20. package/dist/server/index.js +1 -1
  21. package/package.json +1 -1
  22. package/dist/chunks/config-store-D4vUBcUX.js +0 -1
  23. package/dist/client/assets/index-BedqDfKJ.js +0 -177
@@ -4,7 +4,7 @@ import { i as errorText } from "../chunks/text-DoirglWV.js";
4
4
  import { o as packageRoot } from "../chunks/runtime-paths-ghcH9CeW.js";
5
5
  import { t as AGENT_API_VERBS } from "../chunks/session-CUc6d7aS.js";
6
6
  import { i as execSync } from "../chunks/child-process-safe-D4hyVIXj.js";
7
- import { r as agentCommandHelpLines } from "../chunks/agent-api-core-DmPT6Hc_.js";
7
+ import { r as agentCommandHelpLines } from "../chunks/agent-api-core-BCFplxXu.js";
8
8
  import { t as renderTable } from "../chunks/ascii-figure-core-pDAwtlKO.js";
9
9
  import { n as glimmervoidHomeDir, t as decideConfigPath } from "../chunks/config-path-core-DFt-TemS.js";
10
10
  import { i as parseCommandLine, r as gitDoctorRows, t as probeGitVersion } from "../chunks/git-version-C3lznLS_.js";
@@ -65,7 +65,7 @@ var OWN_SUBCOMMAND_RUNNERS = [
65
65
  return 0;
66
66
  }],
67
67
  ["pair", async (subcommandArgs) => {
68
- const { runPairCli } = await import("../chunks/pair-cli-BwOTWShx.js");
68
+ const { runPairCli } = await import("../chunks/pair-cli-CWHMbInF.js");
69
69
  return runPairCli(subcommandArgs);
70
70
  }],
71
71
  ["agent", async (subcommandArgs) => {
@@ -73,7 +73,7 @@ var OWN_SUBCOMMAND_RUNNERS = [
73
73
  return runAgentSetupCli(subcommandArgs);
74
74
  }],
75
75
  ["settings", async (subcommandArgs) => {
76
- const { runSettingsCli } = await import("../chunks/settings-cli-C_owm3rw.js");
76
+ const { runSettingsCli } = await import("../chunks/settings-cli-DGOkkmW-.js");
77
77
  return runSettingsCli(subcommandArgs);
78
78
  }],
79
79
  ["visions", async (subcommandArgs) => {
@@ -81,13 +81,13 @@ var OWN_SUBCOMMAND_RUNNERS = [
81
81
  return runVisionsCli(subcommandArgs);
82
82
  }],
83
83
  ["ssh-sign", async (subcommandArgs) => {
84
- const { runSshSignCli } = await import("../chunks/ssh-sign-cli-CDjUtDKa.js");
84
+ const { runSshSignCli } = await import("../chunks/ssh-sign-cli-BdvvBKkj.js");
85
85
  return runSshSignCli(subcommandArgs);
86
86
  }]
87
87
  ];
88
88
  var ownSubcommandNames = new Set(OWN_SUBCOMMAND_RUNNERS.map(([name]) => name));
89
89
  var SUBCOMMAND_RUNNERS = new Map([...OWN_SUBCOMMAND_RUNNERS, ...AGENT_API_VERBS.filter((verb) => !ownSubcommandNames.has(verb)).map((verb) => [verb, async (subcommandArgs, subcommandName) => {
90
- const { runAgentApiCli } = await import("../chunks/agent-api-cli-ep_5T7Hx.js");
90
+ const { runAgentApiCli } = await import("../chunks/agent-api-cli-B-QxkZAQ.js");
91
91
  return runAgentApiCli([subcommandName, ...subcommandArgs]);
92
92
  }])]);
93
93
  var AGENT_INSTALL_COMMAND_BY_ID = {
@@ -101,7 +101,7 @@ function missingAgentText(agentId) {
101
101
  }
102
102
  async function printSessionLimits() {
103
103
  if (!process.env["GLIMMERVOID_AGENT_URL"]) return;
104
- const { sessionLimitsHelpLines } = await import("../chunks/agent-api-cli-ep_5T7Hx.js");
104
+ const { sessionLimitsHelpLines } = await import("../chunks/agent-api-cli-B-QxkZAQ.js");
105
105
  const limitsLines = await sessionLimitsHelpLines();
106
106
  console.log(`\n${limitsLines.join("\n")}`);
107
107
  }
@@ -158,7 +158,7 @@ async function readDeclaredCustomAgents() {
158
158
  declared: [],
159
159
  error: null
160
160
  };
161
- const { loadConfigFile } = await import("../chunks/config-store-D4vUBcUX.js");
161
+ const { loadConfigFile } = await import("../chunks/config-store-DVwdcnub.js");
162
162
  try {
163
163
  const loaded = loadConfigFile(decided.path, { exitOnError: false });
164
164
  if (!loaded.config) return {
@@ -234,7 +234,7 @@ async function runDoctor() {
234
234
  }
235
235
  switchSection("Agents");
236
236
  try {
237
- const { listAgentIds, describeAgentResolvability, setCustomAgents } = await import("../chunks/adapters-DjDtNufj.js");
237
+ const { listAgentIds, describeAgentResolvability, setCustomAgents } = await import("../chunks/adapters-B2IgKmuZ.js");
238
238
  const declaredCustomAgents = await readDeclaredCustomAgents();
239
239
  if (declaredCustomAgents.error) line("config", declaredCustomAgents.error);
240
240
  setCustomAgents(declaredCustomAgents.declared);
@@ -1 +1 @@
1
- export { a as describeAgentResolvability, l as listAgentIds, f as setCustomAgents } from "./adapters-CSRTLFiZ.js";
1
+ export { a as describeAgentResolvability, l as listAgentIds, f as setCustomAgents } from "./adapters-BsoXEvlZ.js";
@@ -1,14 +1,14 @@
1
1
  import { s as relayPath } from "./runtime-paths-ghcH9CeW.js";
2
2
  import { Vt as shortSha$1, zt as FULL_SHA_RE } from "./session-CUc6d7aS.js";
3
3
  import { n as execFileAsync, r as execFileSync } from "./child-process-safe-D4hyVIXj.js";
4
- import { y as InstallFlavor } from "./config-CGRYpcBQ.js";
4
+ import { y as InstallFlavor } from "./config-Dh4e-Mkv.js";
5
5
  import { o as supervisionLine } from "./session-routes--hrsvv7a.js";
6
6
  import { c as textOr, s as rawTextOr } from "./coerce-NSst8oRP.js";
7
7
  import { n as resolveAgentCommand, t as buildAgentSpawnCommand } from "./spawn-command-Cc40FiZI.js";
8
8
  import { r as nextBackoffMs } from "./backoff-DjVpfHk7.js";
9
9
  import { i as isSpinnerChar, n as classifyAgentTitle, r as isBrailleChar, s as buildAgentEnv, t as grok } from "./grok-Di4aQGre.js";
10
10
  import { t as buildHookCommand } from "./hook-command-core-qTNK-xMF.js";
11
- import "./contracts-Fup4hhP9.js";
11
+ import "./contracts-dj-GFptp.js";
12
12
  import { n as mergeCodexPreToolUse, t as HOOK_TOOLS } from "./hook-tools-Dl7-r2Eb.js";
13
13
  import fs from "node:fs";
14
14
  import path from "node:path";
@@ -1 +1 @@
1
- export { t as askAgentApi, r as runAgentApiCli, i as sessionLimitsHelpLines } from "./agent-api-cli-CVgij_62.js";
1
+ export { t as askAgentApi, r as runAgentApiCli, i as sessionLimitsHelpLines } from "./agent-api-cli-DIl92JjQ.js";
@@ -1,7 +1,7 @@
1
1
  import { t as errorCode } from "./text-DoirglWV.js";
2
2
  import { c as AgentLimitsReply, n as AGENT_URL_ENV } from "./session-CUc6d7aS.js";
3
3
  import { i as formatSessionLimits } from "./session-routes--hrsvv7a.js";
4
- import { f as isAgentApiVerb, t as AGENT_COMMAND_HELP } from "./agent-api-core-DmPT6Hc_.js";
4
+ import { f as isAgentApiVerb, t as AGENT_COMMAND_HELP } from "./agent-api-core-BCFplxXu.js";
5
5
  import { i as resolveHookTarget } from "./hook-relay-core-DA_bz2KA.js";
6
6
  import { n as decideGuardrailsProxy } from "./guardrails-proxy-core-BI3rdY-m.js";
7
7
  import { t as parseJsonOrNull } from "./json-core-dfa_7Fak.js";
@@ -1,5 +1,5 @@
1
1
  import { R as TASK_TITLE_CONTROL_CHARACTERS, T as RefinedTaskTitle, a as AgentAttentionRequest, d as AgentSendRequest, i as AgentAnswerRequest, l as AgentPullRequestRequest, m as AgentSpawnRequest, o as AgentCloseRequest, p as AgentSettingsRequest, s as AgentEditRequest, t as AGENT_API_VERBS, u as AgentReadRequest } from "./session-CUc6d7aS.js";
2
- import { c as TASK_TITLE_SOURCE_PRIORITY, o as PersistedTaskTitle, w as pullRequestKeyFromReference } from "./config-CGRYpcBQ.js";
2
+ import { c as TASK_TITLE_SOURCE_PRIORITY, o as PersistedTaskTitle, w as pullRequestKeyFromReference } from "./config-Dh4e-Mkv.js";
3
3
  import { n as NO_OWN_WORKTREE_REASON, t as COMMAND_ROUTES } from "./session-routes--hrsvv7a.js";
4
4
  import path from "node:path";
5
5
  import crypto from "node:crypto";
@@ -1672,6 +1672,7 @@ var clientVariants = [
1672
1672
  loose("restart-server"),
1673
1673
  loose("focus-change", { focused: z.boolean() }),
1674
1674
  loose("request-health-snapshot"),
1675
+ loose("request-telemetry-deletion", { requestId }),
1675
1676
  loose("update-check"),
1676
1677
  loose("update-apply"),
1677
1678
  loose("session-trace", {
@@ -1807,6 +1808,7 @@ Object.freeze([
1807
1808
  "open-issue-session-result",
1808
1809
  "open-team-review-session-result",
1809
1810
  "radar-issue-action-result",
1811
+ "telemetry-deletion-result",
1810
1812
  "team-review-action-result",
1811
1813
  "benchmark-action-result",
1812
1814
  "my-pr-merge-result",
@@ -2267,6 +2269,10 @@ var serverVariants = [
2267
2269
  ...TeamReviewActionResult.shape,
2268
2270
  requestId
2269
2271
  }),
2272
+ loose("telemetry-deletion-result", {
2273
+ requestId,
2274
+ ok: z.boolean()
2275
+ }),
2270
2276
  loose("benchmark-action-result", {
2271
2277
  ...BenchmarkActionResult.shape,
2272
2278
  requestId
@@ -1,10 +1,10 @@
1
1
  import { n as errorLabel, r as errorMessage } from "./text-DoirglWV.js";
2
2
  import { n as equalsIgnoringCaseOnWindows } from "./paths-Bu4eH1Yd.js";
3
- import { $ as POSITIVE_NUMBER_RANGE, G as FLYING_ANIMALS_DEFAULTS, J as FLYING_ANIMALS_SCALE_RANGE, K as FLYING_ANIMALS_DURATION_RANGE, Q as PORT_RANGE, X as MEMORY_RESERVE_MB_RANGE, Y as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, Z as NON_NEGATIVE_NUMBER_RANGE, at as TASK_TITLE_TIMEOUT_RANGE, ct as USAGE_RETAIN_DAYS_RANGE, d as POST_TURN_CHECK_MODES, dt as WORKFLOWS_MAX_CONCURRENT_SESSIONS_RANGE, et as POSTHOG_FIX_TIMEOUT_RANGE, f as UPDATE_CHANNELS, h as normalizeLegacyConfigNumbers, i as Config, it as REPLAY_BUFFER_KB_RANGE, l as configIssueMessage, lt as USAGE_SCAN_INTERVAL_RANGE, n as BUILTIN_AGENT_IDS, nt as POSTHOG_TRAFFIC_MIN_USERS_RANGE, ot as USAGE_BUDGET_RANGE, p as USAGE_COST_MODES, q as FLYING_ANIMALS_GAP_RANGE, rt as POSTHOG_TRAFFIC_MULTIPLIER_RANGE, s as RUNTIME_CONFIG_SCALAR_KEYS, st as USAGE_INTEGER_RANGES, t as AGENT_ID_SHAPE_MESSAGE, tt as POSTHOG_TRAFFIC_BASELINE_RANGE, u as BranchGcFileSettings, ut as WORKFLOWS_MAX_ACTIONS_PER_POLL_RANGE } from "./config-CGRYpcBQ.js";
3
+ import { $ as POSITIVE_NUMBER_RANGE, G as FLYING_ANIMALS_DEFAULTS, J as FLYING_ANIMALS_SCALE_RANGE, K as FLYING_ANIMALS_DURATION_RANGE, Q as PORT_RANGE, X as MEMORY_RESERVE_MB_RANGE, Y as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, Z as NON_NEGATIVE_NUMBER_RANGE, at as TASK_TITLE_TIMEOUT_RANGE, ct as USAGE_RETAIN_DAYS_RANGE, d as POST_TURN_CHECK_MODES, dt as WORKFLOWS_MAX_CONCURRENT_SESSIONS_RANGE, et as POSTHOG_FIX_TIMEOUT_RANGE, f as UPDATE_CHANNELS, h as normalizeLegacyConfigNumbers, i as Config, it as REPLAY_BUFFER_KB_RANGE, l as configIssueMessage, lt as USAGE_SCAN_INTERVAL_RANGE, n as BUILTIN_AGENT_IDS, nt as POSTHOG_TRAFFIC_MIN_USERS_RANGE, ot as USAGE_BUDGET_RANGE, p as USAGE_COST_MODES, q as FLYING_ANIMALS_GAP_RANGE, rt as POSTHOG_TRAFFIC_MULTIPLIER_RANGE, s as RUNTIME_CONFIG_SCALAR_KEYS, st as USAGE_INTEGER_RANGES, t as AGENT_ID_SHAPE_MESSAGE, tt as POSTHOG_TRAFFIC_BASELINE_RANGE, u as BranchGcFileSettings, ut as WORKFLOWS_MAX_ACTIONS_PER_POLL_RANGE } from "./config-Dh4e-Mkv.js";
4
4
  import { n as isRecord } from "./coerce-NSst8oRP.js";
5
5
  import { n as glimmervoidHomeDir$1, t as decideConfigPath } from "./config-path-core-DFt-TemS.js";
6
6
  import { d as writeJsonAtomicSync, f as writeTextAtomic, p as writeTextAtomicSync } from "./json-file-DFCTvPjj.js";
7
- import { s as FeatureFlagsResponse, u as TELEMETRY_KILL_SWITCH_FLAG } from "./contracts-Fup4hhP9.js";
7
+ import { s as FeatureFlagsResponse, u as TELEMETRY_KILL_SWITCH_FLAG } from "./contracts-dj-GFptp.js";
8
8
  import fs from "node:fs";
9
9
  import path from "node:path";
10
10
  import os from "node:os";
@@ -264,7 +264,11 @@ var POSTHOG_INGEST_HOST = "https://us.i.posthog.com";
264
264
  var TELEMETRY_BATCH_URL = `${POSTHOG_INGEST_HOST}/batch/`;
265
265
  var TELEMETRY_FLAGS_URL = `${POSTHOG_INGEST_HOST}/flags?v=2`;
266
266
  var MAX_STACK_LENGTH = 16384;
267
- var FIRST_RUN_NOTICE = ["Anonymous usage data is on. Never paths, prompts or output. Details: https://github.com/johncwaters/glimmervoid/blob/main/docs/configuration.md#telemetry", "Turn it off in Settings > Privacy, or GLIMMERVOID_TELEMETRY=0."].join("\n");
267
+ var ACCOUNT_HASH_SALT = "glimmervoid-account-hash-v1";
268
+ var OPENAI_AUTH_CLAIM = "https://api.openai.com/auth";
269
+ var UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
270
+ var OPENAI_USER_ID_PATTERN = /^user-[A-Za-z0-9]+$/;
271
+ var FIRST_RUN_NOTICE = ["Glimmervoid collects usage data to help us improve it. No prompts or project information are collected.", "Turn it off in Settings > Privacy, or GLIMMERVOID_TELEMETRY=0."].join("\n");
268
272
  var TRUTHY_FLAGS = /* @__PURE__ */ new Set([
269
273
  "1",
270
274
  "true",
@@ -573,6 +577,45 @@ function decideIsDevInstall({ installFlavor, isBundled, homeDir, defaultHomeDir
573
577
  if (installFlavor === "clone" || !isBundled) return true;
574
578
  return comparablePath(homeDir) !== comparablePath(defaultHomeDir);
575
579
  }
580
+ function parseJsonOrNull(text) {
581
+ try {
582
+ return JSON.parse(text);
583
+ } catch {
584
+ return null;
585
+ }
586
+ }
587
+ function fieldOf(value, key) {
588
+ if (typeof value !== "object" || value === null || !(key in value)) return void 0;
589
+ return Reflect.get(value, key);
590
+ }
591
+ function hashAccountId(rawAccountId) {
592
+ return createHash("sha256").update(`${ACCOUNT_HASH_SALT}:${rawAccountId}`).digest("hex");
593
+ }
594
+ function claudeAccountUuidOf(claudeConfigText) {
595
+ const accountUuid = fieldOf(fieldOf(parseJsonOrNull(claudeConfigText), "oauthAccount"), "accountUuid");
596
+ return typeof accountUuid === "string" && UUID_PATTERN.test(accountUuid) ? accountUuid : null;
597
+ }
598
+ function codexUserIdOf(codexAuthText) {
599
+ const idToken = fieldOf(fieldOf(parseJsonOrNull(codexAuthText), "tokens"), "id_token");
600
+ if (typeof idToken !== "string") return null;
601
+ const encodedClaims = idToken.split(".")[1];
602
+ if (!encodedClaims) return null;
603
+ const userId = fieldOf(fieldOf(parseJsonOrNull(Buffer.from(encodedClaims, "base64url").toString("utf8")), OPENAI_AUTH_CLAIM), "user_id");
604
+ return typeof userId === "string" && OPENAI_USER_ID_PATTERN.test(userId) ? userId : null;
605
+ }
606
+ function buildPersonProperties(accountIds, firstSeen) {
607
+ return {
608
+ $set: {
609
+ ...accountIds.claudeAccountUuid ? { claude_account_hash: hashAccountId(accountIds.claudeAccountUuid) } : {},
610
+ ...accountIds.codexUserId ? { codex_user_hash: hashAccountId(accountIds.codexUserId) } : {}
611
+ },
612
+ $set_once: {
613
+ first_app_version: firstSeen.appVersion.slice(0, 512),
614
+ first_os_platform: firstSeen.osPlatform.slice(0, 512),
615
+ first_install_flavor: firstSeen.installFlavor.slice(0, 512)
616
+ }
617
+ };
618
+ }
576
619
  function nodeMajorVersion(nodeVersion) {
577
620
  const major = Number.parseInt(nodeVersion.replace(/^v/, ""), 10);
578
621
  return Number.isFinite(major) ? major : 0;
@@ -1834,8 +1877,8 @@ var SECTIONS = Object.freeze([
1834
1877
  settings: [{
1835
1878
  id: "telemetry-enabled",
1836
1879
  path: "telemetry.enabled",
1837
- title: "Send anonymous usage and error data",
1838
- description: "Version, platform, app starts, daily activity, session starts and ends with agent kind, exit kind and duration, errors as their type, error code and scrubbed stack frames, per session token counts, models and estimated costs from the usage scan, under a random install id. Never error messages, paths, repository or branch names, prompts, objectives or terminal output. GLIMMERVOID_TELEMETRY=0, DO_NOT_TRACK=1 or CI=true turn it off regardless.",
1880
+ title: "Send usage data",
1881
+ description: "Helps us improve Glimmervoid. Sent under a random install id: version, platform, app starts, daily activity, session starts and ends with agent kind, exit kind and duration, errors as their type, error code and scrubbed stack frames, per session token counts, models and estimated costs from the usage scan, and a salted one-way hash of your Claude and Codex account ids so installs of one account count together. Never prompts, project information, error messages, paths, repository or branch names, objectives, terminal output, emails or names. Delete my data asks for everything sent under this install to be erased and starts a new install id. GLIMMERVOID_TELEMETRY=0, DO_NOT_TRACK=1 or CI=true turn it off regardless.",
1839
1882
  control: "toggle",
1840
1883
  keywords: [
1841
1884
  "telemetry",
@@ -3697,7 +3740,7 @@ function retiredGuardrailKeysWarning(config) {
3697
3740
  if (retiredKeys.length === 0) return null;
3698
3741
  return `[guardrails] config.json still has ${retiredKeys.join(" and ")}. These keys are ignored, so their unreadable paths and opt-outs do not apply until you move them.`;
3699
3742
  }
3700
- function createConfigStore({ settingsDefaults } = {}) {
3743
+ function createConfigStore({ settingsDefaults, readTelemetryInstallId } = {}) {
3701
3744
  const configPath = resolveConfigPath();
3702
3745
  const effectiveDefaults = {
3703
3746
  ...DEFAULT_CONFIG,
@@ -3847,6 +3890,7 @@ function createConfigStore({ settingsDefaults } = {}) {
3847
3890
  ...config.telemetry
3848
3891
  }),
3849
3892
  telemetryForcedOff: isTelemetryForcedOff(process.env),
3893
+ telemetryInstallId: readTelemetryInstallId?.() ?? null,
3850
3894
  rtk: config.rtk ?? effectiveDefaults.rtk,
3851
3895
  rtkInstallSupported: assetForPlatform(process.platform, process.arch) !== null,
3852
3896
  saneYolo: config.saneYolo ?? effectiveDefaults.saneYolo,
@@ -3993,4 +4037,4 @@ function createConfigStore({ settingsDefaults } = {}) {
3993
4037
  };
3994
4038
  }
3995
4039
  //#endregion
3996
- export { DEFAULT_BRANCH_GC_PREFIXES as $, settingsOf as A, buildExceptionProperties as B, deleteValueAtPath as C, scoreSettingsSearch as D, parsePosthogProjectSelection as E, TELEMETRY_BATCH_URL as F, exceptionFingerprint as G, decideIsDevInstall as H, TELEMETRY_FLAGS_URL as I, resolveProjectToken as J, nodeMajorVersion as K, adapterBucket as L, FILE_ONLY_GROUPS as M, SETTINGS_REGISTRY as N, setValueAtPath as O, FIRST_RUN_NOTICE as P, withEnvSecrets as Q, buildAiGenerationEvents as R, cloneValue as S, hasScaledUnit as T, decideRemoteTelemetryState as U, classifySessionExit as V, decideTelemetryConsent as W, readEnvSecrets as X, ENV_SECRET_BINDINGS as Y, stableConfigKey as Z, SECRET_PRESENCE_SUFFIX as _, generateProjectId as a, worktreeIntegrationTips as at, validateSettingsBlock as b, resolveConfigPath as c, isSameDirectoryPath as ct, assetForPlatform as d, matchedPrefix as et, decideRtkInstall as f, verifyDigest as g, isRtkBinaryName as h, ensureProjectIds as i, usablePrefixes as it, valueAtPath as j, settingsGroupOf as k, saveConfigFileOnce as l, installTargetPath as m, DEFAULT_CONFIG as n, planWorktreeGc as nt, glimmervoidHomeDir as o, canonicalizePath as ot, findEscapingArchiveMember as p, parsePosthogReleaseId as q, createConfigStore as r, sessionIdFromBranch as rt, loadConfigFile as s, comparableDirectoryPath as st, ABORT_CONFIG_SAVE as t, planBranchGc as tt, validateConfig as u, mergeSettingsBlock as v, displayText as w, SETTINGS_INDEX as x, settingsBlockSpecFor as y, buildBrowserExceptionProperties as z };
4040
+ export { readEnvSecrets as $, settingsOf as A, buildExceptionProperties as B, deleteValueAtPath as C, scoreSettingsSearch as D, parsePosthogProjectSelection as E, TELEMETRY_BATCH_URL as F, decideIsDevInstall as G, classifySessionExit as H, TELEMETRY_FLAGS_URL as I, exceptionFingerprint as J, decideRemoteTelemetryState as K, adapterBucket as L, FILE_ONLY_GROUPS as M, SETTINGS_REGISTRY as N, setValueAtPath as O, FIRST_RUN_NOTICE as P, ENV_SECRET_BINDINGS as Q, buildAiGenerationEvents as R, cloneValue as S, hasScaledUnit as T, claudeAccountUuidOf as U, buildPersonProperties as V, codexUserIdOf as W, parsePosthogReleaseId as X, nodeMajorVersion as Y, resolveProjectToken as Z, SECRET_PRESENCE_SUFFIX as _, generateProjectId as a, planWorktreeGc as at, validateSettingsBlock as b, resolveConfigPath as c, worktreeIntegrationTips as ct, assetForPlatform as d, isSameDirectoryPath as dt, stableConfigKey as et, decideRtkInstall as f, verifyDigest as g, isRtkBinaryName as h, ensureProjectIds as i, planBranchGc as it, valueAtPath as j, settingsGroupOf as k, saveConfigFileOnce as l, canonicalizePath as lt, installTargetPath as m, DEFAULT_CONFIG as n, DEFAULT_BRANCH_GC_PREFIXES as nt, glimmervoidHomeDir as o, sessionIdFromBranch as ot, findEscapingArchiveMember as p, decideTelemetryConsent as q, createConfigStore as r, matchedPrefix as rt, loadConfigFile as s, usablePrefixes as st, ABORT_CONFIG_SAVE as t, withEnvSecrets as tt, validateConfig as u, comparableDirectoryPath as ut, mergeSettingsBlock as v, displayText as w, SETTINGS_INDEX as x, settingsBlockSpecFor as y, buildBrowserExceptionProperties as z };
@@ -0,0 +1 @@
1
+ export { s as loadConfigFile } from "./config-store-CEsetno2.js";
@@ -1,5 +1,5 @@
1
1
  import "./session-CUc6d7aS.js";
2
- import { C as OPERATOR_SURFACES, S as OPERATOR_ACTIONS_BY_SURFACE, b as ONBOARDING_STEPS, n as BUILTIN_AGENT_IDS, v as DASHBOARD_VIEWS, x as ONBOARDING_STEP_STATES } from "./config-CGRYpcBQ.js";
2
+ import { C as OPERATOR_SURFACES, S as OPERATOR_ACTIONS_BY_SURFACE, b as ONBOARDING_STEPS, n as BUILTIN_AGENT_IDS, v as DASHBOARD_VIEWS, x as ONBOARDING_STEP_STATES } from "./config-Dh4e-Mkv.js";
3
3
  import { z } from "zod";
4
4
  //#region shared/contracts/telemetry.ts
5
5
  var TELEMETRY_ADAPTERS = Object.freeze([...BUILTIN_AGENT_IDS, "custom"]);
@@ -62,8 +62,27 @@ var RADAR_HANDOFF_STEPS = Object.freeze([
62
62
  var OPERATOR_ACTIONS = Object.freeze([...new Set(Object.values(OPERATOR_ACTIONS_BY_SURFACE).flat())]);
63
63
  var nonNegativeInteger = z.number().int().nonnegative();
64
64
  var boundedText = z.string().max(512);
65
- var AppStartedProperties = z.object({}).strict();
66
- var AppActiveProperties = z.object({ active_session_count: nonNegativeInteger }).strict();
65
+ var sha256Hex = z.string().regex(/^[0-9a-f]{64}$/);
66
+ var PersonProperties = z.object({
67
+ $set: z.object({
68
+ claude_account_hash: sha256Hex.optional(),
69
+ codex_user_hash: sha256Hex.optional()
70
+ }).strict(),
71
+ $set_once: z.object({
72
+ first_app_version: boundedText,
73
+ first_os_platform: boundedText,
74
+ first_install_flavor: boundedText
75
+ }).strict()
76
+ }).strict();
77
+ var AppStartedProperties = z.object({
78
+ is_first_start: z.boolean(),
79
+ ...PersonProperties.partial().shape
80
+ }).strict();
81
+ var AppActiveProperties = z.object({
82
+ active_session_count: nonNegativeInteger,
83
+ ...PersonProperties.partial().shape
84
+ }).strict();
85
+ var DataDeletionRequestedProperties = z.object({}).strict();
67
86
  var SessionStartedProperties = z.object({ adapter: z.enum(TELEMETRY_ADAPTERS) }).strict();
68
87
  var SessionEndedProperties = z.object({
69
88
  adapter: z.enum(TELEMETRY_ADAPTERS),
@@ -162,16 +181,17 @@ var TELEMETRY_EVENT_SCHEMAS = Object.freeze({
162
181
  team_review_settled: TeamReviewSettledProperties,
163
182
  team_review_post_refused: TeamReviewPostRefusedProperties,
164
183
  radar_investigation_finished: RadarInvestigationFinishedProperties,
165
- radar_fix_handoff_failed: RadarFixHandoffFailedProperties
184
+ radar_fix_handoff_failed: RadarFixHandoffFailedProperties,
185
+ data_deletion_requested: DataDeletionRequestedProperties
166
186
  });
167
187
  Object.freeze([
168
188
  {
169
189
  name: "app_started",
170
- description: "The server started listening."
190
+ description: "The server started listening, and whether this is the first start, with no Glimmervoid config file yet. Also sets the person properties: a one-way hash of the Claude Code account id and the Codex user id when logged in, and the first version, platform and install flavor seen."
171
191
  },
172
192
  {
173
193
  name: "app_active",
174
- description: "Once a day while the server runs, with how many sessions are live."
194
+ description: "Once a day while the server runs, with how many sessions are live, and the same person properties as app_started."
175
195
  },
176
196
  {
177
197
  name: "session_started",
@@ -220,6 +240,10 @@ Object.freeze([
220
240
  {
221
241
  name: "radar_fix_handoff_failed",
222
242
  description: "Handing a Radar fix over as a pull request failed, with which step failed. Never the branch or the error text."
243
+ },
244
+ {
245
+ name: "data_deletion_requested",
246
+ description: "Delete my data was confirmed in Settings > Privacy, with no properties. Sent under the old install id even when telemetry is off, unless the maintainers stopped all sending, and then the install id is replaced. PostHog deletes the person and every event under that id on receipt."
223
247
  }
224
248
  ]);
225
249
  Object.freeze([