glimmervoid 0.43.5 → 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 (29) hide show
  1. package/dist/bin/glimmervoid.js +13 -13
  2. package/dist/chunks/{adapters-43NBaf3J.js → adapters-B2IgKmuZ.js} +1 -1
  3. package/dist/chunks/{adapters-DCXbfZ2V.js → adapters-BsoXEvlZ.js} +5 -5
  4. package/dist/chunks/{agent-api-cli-CgQTmmLd.js → agent-api-cli-B-QxkZAQ.js} +1 -1
  5. package/dist/chunks/{agent-api-cli-6W5lx3AO.js → agent-api-cli-DIl92JjQ.js} +3 -3
  6. package/dist/chunks/{agent-api-core-DniJGdf6.js → agent-api-core-BCFplxXu.js} +6 -5
  7. package/dist/chunks/{agent-setup-cli-B5vnfQXA.js → agent-setup-cli-7hG401Io.js} +1 -1
  8. package/dist/chunks/{config-bGil1wqg.js → config-Dh4e-Mkv.js} +34 -5
  9. package/dist/chunks/{config-store-GsSGMu08.js → config-store-CEsetno2.js} +52 -8
  10. package/dist/chunks/config-store-DVwdcnub.js +1 -0
  11. package/dist/chunks/{contracts-s0s0gCZJ.js → contracts-dj-GFptp.js} +63 -17
  12. package/dist/chunks/{git-version-BwJ-H5Gl.js → git-version-C3lznLS_.js} +1 -1
  13. package/dist/chunks/{grok-BYvOJJMV.js → grok-Di4aQGre.js} +1 -1
  14. package/dist/chunks/{main-uV_6B2Am.js → main-CA3ONCUS.js} +4677 -4221
  15. package/dist/chunks/{pair-cli-BFg0PF9X.js → pair-cli-CWHMbInF.js} +2 -2
  16. package/dist/chunks/{remote-config-yLvSEm11.js → remote-config-CtcoO10O.js} +1 -1
  17. package/dist/chunks/{session-GoNLV4AT.js → session-CUc6d7aS.js} +11 -2
  18. package/dist/chunks/{session-routes-BBWZ5xmv.js → session-routes--hrsvv7a.js} +1 -1
  19. package/dist/chunks/{settings-cli-Do404URB.js → settings-cli-DGOkkmW-.js} +5 -5
  20. package/dist/chunks/{settings-readout-core-x331h4CR.js → settings-readout-core-BVb6tTLq.js} +2 -2
  21. package/dist/chunks/{ssh-sign-cli-BG0t2-3v.js → ssh-sign-cli-BdvvBKkj.js} +2 -2
  22. package/dist/client/assets/index-BR-wN5UF.js +177 -0
  23. package/dist/client/assets/index-QxVyoSUP.css +2 -0
  24. package/dist/client/index.html +6 -5
  25. package/dist/server/index.js +1 -1
  26. package/package.json +6 -5
  27. package/dist/chunks/config-store-C2CaymPs.js +0 -1
  28. package/dist/client/assets/index-BhMm8IuJ.css +0 -2
  29. package/dist/client/assets/index-DRT1ZGFh.js +0 -177
@@ -2,12 +2,12 @@
2
2
  import { o as nodePtyRebuildHint, r as firstLine, t as probeNodePty } from "../chunks/node-pty-preflight-C8QIlrtU.js";
3
3
  import { i as errorText } from "../chunks/text-DoirglWV.js";
4
4
  import { o as packageRoot } from "../chunks/runtime-paths-ghcH9CeW.js";
5
- import { t as AGENT_API_VERBS } from "../chunks/session-GoNLV4AT.js";
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-DniJGdf6.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
- import { i as parseCommandLine, r as gitDoctorRows, t as probeGitVersion } from "../chunks/git-version-BwJ-H5Gl.js";
10
+ import { i as parseCommandLine, r as gitDoctorRows, t as probeGitVersion } from "../chunks/git-version-C3lznLS_.js";
11
11
  import { i as guardrailsDoctorRows, r as probeGuardrailsDependencies } from "../chunks/guardrails-deps-BjPzk1rE.js";
12
12
  import { i as pnpmGlobalBinDir, n as npmGlobalBinDir, r as onPath, t as formatPathNotice } from "../chunks/path-doctor-C23VAqeu.js";
13
13
  import fs from "node:fs";
@@ -65,15 +65,15 @@ var OWN_SUBCOMMAND_RUNNERS = [
65
65
  return 0;
66
66
  }],
67
67
  ["pair", async (subcommandArgs) => {
68
- const { runPairCli } = await import("../chunks/pair-cli-BFg0PF9X.js");
68
+ const { runPairCli } = await import("../chunks/pair-cli-CWHMbInF.js");
69
69
  return runPairCli(subcommandArgs);
70
70
  }],
71
71
  ["agent", async (subcommandArgs) => {
72
- const { runAgentSetupCli } = await import("../chunks/agent-setup-cli-B5vnfQXA.js");
72
+ const { runAgentSetupCli } = await import("../chunks/agent-setup-cli-7hG401Io.js");
73
73
  return runAgentSetupCli(subcommandArgs);
74
74
  }],
75
75
  ["settings", async (subcommandArgs) => {
76
- const { runSettingsCli } = await import("../chunks/settings-cli-Do404URB.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-BG0t2-3v.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-CgQTmmLd.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-CgQTmmLd.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-C2CaymPs.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-43NBaf3J.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);
@@ -242,7 +242,7 @@ async function runDoctor() {
242
242
  const { label, path: resolvedPath } = describeAgentResolvability(id);
243
243
  line(`${id} (${label})`, resolvedPath ?? missingAgentText(id));
244
244
  }
245
- const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-B5vnfQXA.js");
245
+ const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-7hG401Io.js");
246
246
  const grokSetup = inspectGrokAgentSetup();
247
247
  line("grok hook setup", `${grokSetup.classification}: ${grokSetup.filePath}`);
248
248
  } catch (err) {
@@ -259,7 +259,7 @@ async function runDoctor() {
259
259
  try {
260
260
  const { resolvePackageBin } = await import("../chunks/runtime-paths-Cc0_ZR6V.js");
261
261
  const { execFileSync } = await import("../chunks/child-process-safe-CjVtRjDD.js");
262
- const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-B5vnfQXA.js");
262
+ const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-7hG401Io.js");
263
263
  const binPath = resolvePackageBin("cc-safety-net", "cc-safety-net");
264
264
  line("Sane YOLO", binPath || "not installed");
265
265
  if (binPath) line("cc-safety-net version", execFileSync(process.execPath, [binPath, "--version"], {
@@ -1 +1 @@
1
- export { a as describeAgentResolvability, l as listAgentIds, f as setCustomAgents } from "./adapters-DCXbfZ2V.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
- import { Vt as shortSha$1, zt as FULL_SHA_RE } from "./session-GoNLV4AT.js";
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-bGil1wqg.js";
5
- import { o as supervisionLine } from "./session-routes-BBWZ5xmv.js";
4
+ import { y as InstallFlavor } from "./config-Dh4e-Mkv.js";
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
- import { i as isSpinnerChar, n as classifyAgentTitle, r as isBrailleChar, s as buildAgentEnv, t as grok } from "./grok-BYvOJJMV.js";
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-s0s0gCZJ.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-6W5lx3AO.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
- import { c as AgentLimitsReply, n as AGENT_URL_ENV } from "./session-GoNLV4AT.js";
3
- import { i as formatSessionLimits } from "./session-routes-BBWZ5xmv.js";
4
- import { f as isAgentApiVerb, t as AGENT_COMMAND_HELP } from "./agent-api-core-DniJGdf6.js";
2
+ import { c as AgentLimitsReply, n as AGENT_URL_ENV } from "./session-CUc6d7aS.js";
3
+ import { i as formatSessionLimits } from "./session-routes--hrsvv7a.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,6 +1,6 @@
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-GoNLV4AT.js";
2
- import { S as pullRequestKeyFromReference, c as TASK_TITLE_SOURCE_PRIORITY, o as PersistedTaskTitle } from "./config-bGil1wqg.js";
3
- import { n as NO_OWN_WORKTREE_REASON, t as COMMAND_ROUTES } from "./session-routes-BBWZ5xmv.js";
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-Dh4e-Mkv.js";
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";
6
6
  //#region shared/session-naming.ts
@@ -441,6 +441,7 @@ function chooseRefinedSessionName({ currentName, projectFolderName, proposedName
441
441
  if (!isAutoNameOf(currentName, projectFolderName)) return null;
442
442
  return nextSuggestedName(proposedName, takenNames.filter((name) => name !== currentName));
443
443
  }
444
+ var MAX_LIFETIME_SPAWNS = 10;
444
445
  var MAX_SPAWNS_IN_FLIGHT = 1;
445
446
  var REFUSAL_REASON = "unknown session";
446
447
  var INVALID_BODY_STATUS = 400;
@@ -490,10 +491,10 @@ function decideSpawnAllowance({ liveChildren, lifetimeSpawns, inFlight }) {
490
491
  status: 429,
491
492
  reason: `at most 3 spawned sessions may be live at once`
492
493
  };
493
- if (lifetimeSpawns >= 10) return {
494
+ if (lifetimeSpawns >= MAX_LIFETIME_SPAWNS) return {
494
495
  ok: false,
495
496
  status: 429,
496
- reason: `this session has used its 10 spawns`
497
+ reason: `this session has used its ${MAX_LIFETIME_SPAWNS} spawns`
497
498
  };
498
499
  return { ok: true };
499
500
  }
@@ -1,5 +1,5 @@
1
1
  import { a as isMissingFileError, r as errorMessage } from "./text-DoirglWV.js";
2
- import { a as classifyGrokHooksFile, o as renderGrokHooksFile, t as grok } from "./grok-BYvOJJMV.js";
2
+ import { a as classifyGrokHooksFile, o as renderGrokHooksFile, t as grok } from "./grok-Di4aQGre.js";
3
3
  import { p as writeTextAtomicSync } from "./json-file-DFCTvPjj.js";
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
@@ -1,4 +1,4 @@
1
- import { $ as MyPrMergeWhenReadyRequest, B as UnseenOutcome, Dt as TeamReviewActionResult, Et as TeamReviewActionRequest, F as SessionState, Gt as repoParts, H as MyPr, Ht as GH_SEGMENT, Jt as GithubPrsFreshness, K as MyPrKeepMergeableRequest, Kt as GithubPollingRefreshRequest, Lt as hasRequiredActionHead, N as SessionDoc, O as SESSION_DOC_PATH_MAX_CHARS, P as SessionSnapshot, S as ConversationApprovalDecision, V as LinkedPr, Wt as REPO_SLUG_RE, X as MyPrMergeRequest, Yt as githubPollingShape, Z as MyPrMergeResult, b as ConversationAnswers, ct as pullRequestKeyFormat, et as MyPrMergeWhenReadyResult, jt as TeamReviewStatus, lt as repositoryName, mt as GithubReviewDecision, ot as MyPrsStatus, q as MyPrKeepMergeableResult, qt as GithubPollingRefreshResult, st as SessionPrLinks, tt as MyPrSearchNode, ut as CommitSha, w as PendingWakeup, x as ConversationApproval, y as CoherenceHooksState, yt as ReviewChecksState, z as TaskTitle } from "./session-GoNLV4AT.js";
1
+ import { $ as MyPrMergeWhenReadyRequest, B as UnseenOutcome, Dt as TeamReviewActionResult, Et as TeamReviewActionRequest, F as SessionState, Gt as repoParts, H as MyPr, Ht as GH_SEGMENT, Jt as GithubPrsFreshness, K as MyPrKeepMergeableRequest, Kt as GithubPollingRefreshRequest, Lt as hasRequiredActionHead, N as SessionDoc, O as SESSION_DOC_PATH_MAX_CHARS, P as SessionSnapshot, S as ConversationApprovalDecision, V as LinkedPr, Wt as REPO_SLUG_RE, X as MyPrMergeRequest, Yt as githubPollingShape, Z as MyPrMergeResult, b as ConversationAnswers, ct as pullRequestKeyFormat, et as MyPrMergeWhenReadyResult, jt as TeamReviewStatus, lt as repositoryName, mt as GithubReviewDecision, ot as MyPrsStatus, q as MyPrKeepMergeableResult, qt as GithubPollingRefreshResult, st as SessionPrLinks, tt as MyPrSearchNode, ut as CommitSha, w as PendingWakeup, x as ConversationApproval, y as CoherenceHooksState, yt as ReviewChecksState, z as TaskTitle } from "./session-CUc6d7aS.js";
2
2
  import { n as isRecord } from "./coerce-NSst8oRP.js";
3
3
  import path from "node:path";
4
4
  import { z } from "zod";
@@ -1405,7 +1405,11 @@ var ClientErrorReport = z.object({
1405
1405
  name: z.string().max(128),
1406
1406
  stack: z.string().max(8192)
1407
1407
  }).strict();
1408
- var DASHBOARD_TELEMETRY_EVENTS = Object.freeze(["view_shown", "operator_action"]);
1408
+ var DASHBOARD_TELEMETRY_EVENTS = Object.freeze([
1409
+ "view_shown",
1410
+ "operator_action",
1411
+ "onboarding_step"
1412
+ ]);
1409
1413
  var DASHBOARD_VIEWS = Object.freeze([
1410
1414
  "focus",
1411
1415
  "zen",
@@ -1445,6 +1449,12 @@ var OPERATOR_ACTIONS_BY_SURFACE = Object.freeze({
1445
1449
  "suppress",
1446
1450
  "archive-investigation"
1447
1451
  ],
1452
+ onboarding: [
1453
+ "rescan",
1454
+ "add-root-typed",
1455
+ "add-root-suggested",
1456
+ "add-session"
1457
+ ],
1448
1458
  reviews: [
1449
1459
  "open-session",
1450
1460
  "approve",
@@ -1459,17 +1469,22 @@ var OPERATOR_ACTIONS_BY_SURFACE = Object.freeze({
1459
1469
  "refresh"
1460
1470
  ]
1461
1471
  });
1472
+ var ONBOARDING_STEPS = Object.freeze([
1473
+ "agent",
1474
+ "repo_roots",
1475
+ "first_session"
1476
+ ]);
1477
+ var ONBOARDING_STEP_STATES = Object.freeze(["current", "done"]);
1462
1478
  var OPERATOR_SURFACES = Object.freeze([
1463
1479
  "usage",
1464
1480
  "issues",
1465
1481
  "radar",
1482
+ "onboarding",
1466
1483
  "reviews"
1467
1484
  ]);
1468
1485
  var idOnlyClientTypes = [
1469
1486
  "kill",
1470
1487
  "start-session",
1471
- "restart",
1472
- "force-restart",
1473
1488
  "merge-session",
1474
1489
  "finish-session",
1475
1490
  "merge-continue-session",
@@ -1488,7 +1503,15 @@ function idOnlyClientVariant(type) {
1488
1503
  });
1489
1504
  }
1490
1505
  var idOnlyClientVariants = idOnlyClientTypes.map(idOnlyClientVariant);
1506
+ var restartClientShape = {
1507
+ id: sessionId,
1508
+ force: z.unknown().optional(),
1509
+ fresh: z.unknown().optional(),
1510
+ conversationId: z.string().optional()
1511
+ };
1491
1512
  var clientVariants = [
1513
+ loose("restart", restartClientShape),
1514
+ loose("force-restart", restartClientShape),
1492
1515
  loose("add-session", {
1493
1516
  name: z.string(),
1494
1517
  path: z.string(),
@@ -1649,6 +1672,7 @@ var clientVariants = [
1649
1672
  loose("restart-server"),
1650
1673
  loose("focus-change", { focused: z.boolean() }),
1651
1674
  loose("request-health-snapshot"),
1675
+ loose("request-telemetry-deletion", { requestId }),
1652
1676
  loose("update-check"),
1653
1677
  loose("update-apply"),
1654
1678
  loose("session-trace", {
@@ -1784,6 +1808,7 @@ Object.freeze([
1784
1808
  "open-issue-session-result",
1785
1809
  "open-team-review-session-result",
1786
1810
  "radar-issue-action-result",
1811
+ "telemetry-deletion-result",
1787
1812
  "team-review-action-result",
1788
1813
  "benchmark-action-result",
1789
1814
  "my-pr-merge-result",
@@ -2244,6 +2269,10 @@ var serverVariants = [
2244
2269
  ...TeamReviewActionResult.shape,
2245
2270
  requestId
2246
2271
  }),
2272
+ loose("telemetry-deletion-result", {
2273
+ requestId,
2274
+ ok: z.boolean()
2275
+ }),
2247
2276
  loose("benchmark-action-result", {
2248
2277
  ...BenchmarkActionResult.shape,
2249
2278
  requestId
@@ -2914,4 +2943,4 @@ function configIssueMessage(error) {
2914
2943
  return error.issues[0]?.message || "settings are invalid";
2915
2944
  }
2916
2945
  //#endregion
2917
- export { POSTHOG_TRAFFIC_BASELINE_RANGE as $, CommitComparison as A, IssueUpdate as At, WorkflowLabelName as B, BenchmarkActionRequest as C, PlanDecision as Ct, BenchmarkRun as D, GithubIssuePullRequestsRepository as Dt, BenchmarkJudgement as E, planTitle as Et, GithubPrKey as F, FLYING_ANIMALS_GAP_RANGE as G, WorkflowsState as H, GithubPrLightSearchNode as I, MEMORY_RESERVE_MB_RANGE as J, FLYING_ANIMALS_SCALE_RANGE as K, GithubPrsFrame as L, MinedPrReviewData as M, IssuesState as Mt, PrCheckoutCaseInput as N, IssuesStatus as Nt, BenchmarkStatus as O, GithubIssueResponse as Ot, GithubPrDetailNode as P, issuePullRequestStateFromGithub as Pt, POSTHOG_FIX_TIMEOUT_RANGE as Q, comparablePrKey as R, pullRequestKeyFromReference as S, PLAN_TOOL_NAME as St, BenchmarkId as T, parseExitPlanModeHookPayload as Tt, FLYING_ANIMALS_DEFAULTS as U, WorkflowsSettings as V, FLYING_ANIMALS_DURATION_RANGE as W, PORT_RANGE as X, NON_NEGATIVE_NUMBER_RANGE as Y, POSITIVE_NUMBER_RANGE as Z, ClientMessage as _, changeMapFactId as _t, ConfigUpdate as a, USAGE_INTEGER_RANGES as at, OPERATOR_ACTIONS_BY_SURFACE as b, PLAN_HOOK_OUTPUT_MAX_CHARS as bt, TASK_TITLE_SOURCE_PRIORITY as c, WORKFLOWS_MAX_ACTIONS_PER_POLL_RANGE as ct, POST_TURN_CHECK_MODES as d, SessionSetup as dt, POSTHOG_TRAFFIC_MIN_USERS_RANGE as et, UPDATE_CHANNELS as f, MAX_RAW_LINE_CHARS as ft, CONTROL_FRAME_MAX_BYTES as g, ChangeMap as gt, normalizeLegacyConfigNumbers as h, CoherenceJournalOutput as ht, Config as i, USAGE_BUDGET_RANGE as it, MergedPrListing as j, IssuesSearchResponse as jt, BenchmarkSuite as k, IssueKey as kt, configIssueMessage as l, WORKFLOWS_MAX_CONCURRENT_SESSIONS_RANGE as lt, USAGE_VENDOR_KEYS as m, TraceRecord as mt, BUILTIN_AGENT_IDS as n, REPLAY_BUFFER_KB_RANGE as nt, PersistedTaskTitle as o, USAGE_RETAIN_DAYS_RANGE as ot, USAGE_COST_MODES as p, TraceCheckpoint as pt, KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE as q, BrowserConfig as r, TASK_TITLE_TIMEOUT_RANGE as rt, RUNTIME_CONFIG_SCALAR_KEYS as s, USAGE_SCAN_INTERVAL_RANGE as st, AGENT_ID_SHAPE_MESSAGE as t, POSTHOG_TRAFFIC_MULTIPLIER_RANGE as tt, BranchGcFileSettings as u, UpdateJournal as ut, DASHBOARD_VIEWS as v, PLAN_BODY_CAP_BYTES as vt, BenchmarkCase as w, PlanRevision as wt, OPERATOR_SURFACES as x, PLAN_RESULT_HOOK_EVENT as xt, InstallFlavor as y, PLAN_HOOK_EVENT as yt, WorkflowCommentBody as z };
2946
+ export { POSITIVE_NUMBER_RANGE as $, BenchmarkStatus as A, GithubIssueResponse as At, comparablePrKey as B, OPERATOR_SURFACES as C, PLAN_RESULT_HOOK_EVENT as Ct, BenchmarkId as D, parseExitPlanModeHookPayload as Dt, BenchmarkCase as E, PlanRevision as Et, PrCheckoutCaseInput as F, IssuesStatus as Ft, FLYING_ANIMALS_DEFAULTS as G, WorkflowLabelName as H, GithubPrDetailNode as I, issuePullRequestStateFromGithub as It, FLYING_ANIMALS_SCALE_RANGE as J, FLYING_ANIMALS_DURATION_RANGE as K, GithubPrKey as L, CommitComparison as M, IssueUpdate as Mt, MergedPrListing as N, IssuesSearchResponse as Nt, BenchmarkJudgement as O, planTitle as Ot, MinedPrReviewData as P, IssuesState as Pt, PORT_RANGE as Q, GithubPrLightSearchNode as R, OPERATOR_ACTIONS_BY_SURFACE as S, PLAN_HOOK_OUTPUT_MAX_CHARS as St, BenchmarkActionRequest as T, PlanDecision as Tt, WorkflowsSettings as U, WorkflowCommentBody as V, WorkflowsState as W, MEMORY_RESERVE_MB_RANGE as X, KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE as Y, NON_NEGATIVE_NUMBER_RANGE as Z, ClientMessage as _, CoherenceJournalOutput as _t, ConfigUpdate as a, TASK_TITLE_TIMEOUT_RANGE as at, ONBOARDING_STEPS as b, PLAN_BODY_CAP_BYTES as bt, TASK_TITLE_SOURCE_PRIORITY as c, USAGE_RETAIN_DAYS_RANGE as ct, POST_TURN_CHECK_MODES as d, WORKFLOWS_MAX_CONCURRENT_SESSIONS_RANGE as dt, POSTHOG_FIX_TIMEOUT_RANGE as et, UPDATE_CHANNELS as f, UpdateJournal as ft, CONTROL_FRAME_MAX_BYTES as g, TraceRecord as gt, normalizeLegacyConfigNumbers as h, TraceCheckpoint as ht, Config as i, REPLAY_BUFFER_KB_RANGE as it, BenchmarkSuite as j, IssueKey as jt, BenchmarkRun as k, GithubIssuePullRequestsRepository as kt, configIssueMessage as l, USAGE_SCAN_INTERVAL_RANGE as lt, USAGE_VENDOR_KEYS as m, MAX_RAW_LINE_CHARS as mt, BUILTIN_AGENT_IDS as n, POSTHOG_TRAFFIC_MIN_USERS_RANGE as nt, PersistedTaskTitle as o, USAGE_BUDGET_RANGE as ot, USAGE_COST_MODES as p, SessionSetup as pt, FLYING_ANIMALS_GAP_RANGE as q, BrowserConfig as r, POSTHOG_TRAFFIC_MULTIPLIER_RANGE as rt, RUNTIME_CONFIG_SCALAR_KEYS as s, USAGE_INTEGER_RANGES as st, AGENT_ID_SHAPE_MESSAGE as t, POSTHOG_TRAFFIC_BASELINE_RANGE as tt, BranchGcFileSettings as u, WORKFLOWS_MAX_ACTIONS_PER_POLL_RANGE as ut, DASHBOARD_VIEWS as v, ChangeMap as vt, pullRequestKeyFromReference as w, PLAN_TOOL_NAME as wt, ONBOARDING_STEP_STATES as x, PLAN_HOOK_EVENT as xt, InstallFlavor as y, changeMapFactId as yt, GithubPrsFrame as z };
@@ -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 POSTHOG_TRAFFIC_BASELINE_RANGE, G as FLYING_ANIMALS_GAP_RANGE, J as MEMORY_RESERVE_MB_RANGE, K as FLYING_ANIMALS_SCALE_RANGE, Q as POSTHOG_FIX_TIMEOUT_RANGE, U as FLYING_ANIMALS_DEFAULTS, W as FLYING_ANIMALS_DURATION_RANGE, X as PORT_RANGE, Y as NON_NEGATIVE_NUMBER_RANGE, Z as POSITIVE_NUMBER_RANGE, at as USAGE_INTEGER_RANGES, ct as WORKFLOWS_MAX_ACTIONS_PER_POLL_RANGE, d as POST_TURN_CHECK_MODES, et as POSTHOG_TRAFFIC_MIN_USERS_RANGE, f as UPDATE_CHANNELS, h as normalizeLegacyConfigNumbers, i as Config, it as USAGE_BUDGET_RANGE, l as configIssueMessage, lt as WORKFLOWS_MAX_CONCURRENT_SESSIONS_RANGE, n as BUILTIN_AGENT_IDS, nt as REPLAY_BUFFER_KB_RANGE, ot as USAGE_RETAIN_DAYS_RANGE, p as USAGE_COST_MODES, q as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, rt as TASK_TITLE_TIMEOUT_RANGE, s as RUNTIME_CONFIG_SCALAR_KEYS, st as USAGE_SCAN_INTERVAL_RANGE, t as AGENT_ID_SHAPE_MESSAGE, tt as POSTHOG_TRAFFIC_MULTIPLIER_RANGE, u as BranchGcFileSettings } from "./config-bGil1wqg.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-s0s0gCZJ.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;
@@ -1635,7 +1678,7 @@ var SECTIONS = Object.freeze([
1635
1678
  id: "team-review-re-review-after-hours",
1636
1679
  path: "teamReview.reReviewAfterHours",
1637
1680
  title: "Re-review after",
1638
- description: "When a reviewed PR has a new head, review it again after this long since its last review. Queue review runs it at any time.",
1681
+ description: "When a reviewed PR has a new head, review it again after this long since its last review. Re-run review runs it at any time.",
1639
1682
  control: "number",
1640
1683
  range: POSITIVE_NUMBER_RANGE,
1641
1684
  unit: HOURS,
@@ -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,13 +1,19 @@
1
- import "./session-GoNLV4AT.js";
2
- import { b as OPERATOR_ACTIONS_BY_SURFACE, n as BUILTIN_AGENT_IDS, v as DASHBOARD_VIEWS, x as OPERATOR_SURFACES } from "./config-bGil1wqg.js";
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-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"]);
6
+ var SESSION_END_CAUSES = Object.freeze([
7
+ "removed",
8
+ "replaced",
9
+ "server_stopped"
10
+ ]);
6
11
  var SESSION_EXIT_KINDS = Object.freeze([
7
12
  "clean",
8
13
  "error",
9
14
  "signal",
10
- "no_output"
15
+ "no_output",
16
+ ...SESSION_END_CAUSES
11
17
  ]);
12
18
  var TEAM_REVIEW_SETTLED_OUTCOMES = Object.freeze([
13
19
  "approve",
@@ -56,8 +62,27 @@ var RADAR_HANDOFF_STEPS = Object.freeze([
56
62
  var OPERATOR_ACTIONS = Object.freeze([...new Set(Object.values(OPERATOR_ACTIONS_BY_SURFACE).flat())]);
57
63
  var nonNegativeInteger = z.number().int().nonnegative();
58
64
  var boundedText = z.string().max(512);
59
- var AppStartedProperties = z.object({}).strict();
60
- 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();
61
86
  var SessionStartedProperties = z.object({ adapter: z.enum(TELEMETRY_ADAPTERS) }).strict();
62
87
  var SessionEndedProperties = z.object({
63
88
  adapter: z.enum(TELEMETRY_ADAPTERS),
@@ -72,6 +97,10 @@ var OperatorActionProperties = z.object({
72
97
  surface: z.enum(OPERATOR_SURFACES),
73
98
  action: z.enum(OPERATOR_ACTIONS)
74
99
  }).strict().refine(isActionOfSurface, { message: "action does not belong to its surface" });
100
+ var OnboardingStepProperties = z.object({
101
+ step: z.enum(ONBOARDING_STEPS),
102
+ state: z.enum(ONBOARDING_STEP_STATES)
103
+ }).strict();
75
104
  var TeamReviewDraftedProperties = z.object({ inline_comment_count: nonNegativeInteger }).strict();
76
105
  var TeamReviewSettledProperties = z.object({
77
106
  duration_ms: nonNegativeInteger,
@@ -89,13 +118,20 @@ var RadarInvestigationFinishedProperties = z.object({
89
118
  error_reason: z.enum(RADAR_ERROR_REASONS).optional()
90
119
  }).strict();
91
120
  var RadarFixHandoffFailedProperties = z.object({ step: z.enum(RADAR_HANDOFF_STEPS) }).strict();
92
- var DashboardTelemetryReport = z.discriminatedUnion("event", [z.object({
93
- event: z.literal("view_shown"),
94
- properties: ViewShownProperties
95
- }), z.object({
96
- event: z.literal("operator_action"),
97
- properties: OperatorActionProperties
98
- })]);
121
+ var DashboardTelemetryReport = z.discriminatedUnion("event", [
122
+ z.object({
123
+ event: z.literal("view_shown"),
124
+ properties: ViewShownProperties
125
+ }),
126
+ z.object({
127
+ event: z.literal("operator_action"),
128
+ properties: OperatorActionProperties
129
+ }),
130
+ z.object({
131
+ event: z.literal("onboarding_step"),
132
+ properties: OnboardingStepProperties
133
+ })
134
+ ]);
99
135
  var ExceptionFrame = z.object({
100
136
  platform: z.enum(["node:javascript", "web:javascript"]),
101
137
  function: boundedText,
@@ -140,20 +176,22 @@ var TELEMETRY_EVENT_SCHEMAS = Object.freeze({
140
176
  $ai_generation: AiGenerationProperties,
141
177
  view_shown: ViewShownProperties,
142
178
  operator_action: OperatorActionProperties,
179
+ onboarding_step: OnboardingStepProperties,
143
180
  team_review_drafted: TeamReviewDraftedProperties,
144
181
  team_review_settled: TeamReviewSettledProperties,
145
182
  team_review_post_refused: TeamReviewPostRefusedProperties,
146
183
  radar_investigation_finished: RadarInvestigationFinishedProperties,
147
- radar_fix_handoff_failed: RadarFixHandoffFailedProperties
184
+ radar_fix_handoff_failed: RadarFixHandoffFailedProperties,
185
+ data_deletion_requested: DataDeletionRequestedProperties
148
186
  });
149
187
  Object.freeze([
150
188
  {
151
189
  name: "app_started",
152
- 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."
153
191
  },
154
192
  {
155
193
  name: "app_active",
156
- 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."
157
195
  },
158
196
  {
159
197
  name: "session_started",
@@ -161,7 +199,7 @@ Object.freeze([
161
199
  },
162
200
  {
163
201
  name: "session_ended",
164
- description: "A session exited: how it exited and how long it ran, in whole seconds."
202
+ description: "A session ended: how it exited, or that it was removed, replaced by a settings change or stopped with the server, and how long it ran, in whole seconds."
165
203
  },
166
204
  {
167
205
  name: "$exception",
@@ -177,7 +215,11 @@ Object.freeze([
177
215
  },
178
216
  {
179
217
  name: "operator_action",
180
- description: "An action taken in the Usage, Issues, Radar or Reviews tab: which tab and which action, from a fixed list. Never which repository, pull request, issue or session it was taken on."
218
+ description: "An action taken in the Usage, Issues, Radar or Reviews tab or the first-run checklist: which tab and which action, from a fixed list. Never which repository, pull request, issue or session it was taken on."
219
+ },
220
+ {
221
+ name: "onboarding_step",
222
+ description: "The first-run checklist moved a step to current or done, with which step. Sent once per change while the page is open."
181
223
  },
182
224
  {
183
225
  name: "team_review_drafted",
@@ -198,6 +240,10 @@ Object.freeze([
198
240
  {
199
241
  name: "radar_fix_handoff_failed",
200
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."
201
247
  }
202
248
  ]);
203
249
  Object.freeze([
@@ -1,4 +1,4 @@
1
- import { t as AGENT_API_VERBS } from "./session-GoNLV4AT.js";
1
+ import { t as AGENT_API_VERBS } from "./session-CUc6d7aS.js";
2
2
  import { r as execFileSync } from "./child-process-safe-D4hyVIXj.js";
3
3
  //#region server/core/command-line-core.ts
4
4
  var SUBCOMMANDS_HONORING_TRAILING_GLOBAL_OPTIONS = /* @__PURE__ */ new Set([
@@ -1,6 +1,6 @@
1
1
  import { r as errorMessage } from "./text-DoirglWV.js";
2
2
  import { s as relayPath } from "./runtime-paths-ghcH9CeW.js";
3
- import { j as SIGN_URL_ENV, n as AGENT_URL_ENV } from "./session-GoNLV4AT.js";
3
+ import { j as SIGN_URL_ENV, n as AGENT_URL_ENV } from "./session-CUc6d7aS.js";
4
4
  import { n as isRecord } from "./coerce-NSst8oRP.js";
5
5
  import { t as HOOK_URL_ENV } from "./hook-relay-core-DA_bz2KA.js";
6
6
  import { a as SANE_YOLO_PATH_ENV, o as saneYoloEnv, r as RTK_PATH_ENV } from "./rtk-hook-core-B-MpzPin.js";