glimmervoid 0.45.0 → 0.45.1-next.45

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 (110) hide show
  1. package/dist/bin/glimmervoid.js +15 -15
  2. package/dist/chunks/{adapters-D99c4zCx.js → adapters-BE9BKVW0.js} +24 -24
  3. package/dist/chunks/{adapters-BGuI5U_-.js → adapters-CPaysZkO.js} +1 -1
  4. package/dist/chunks/{agent-api-cli-DdrR2vnB.js → agent-api-cli-B0l8uLos.js} +1 -1
  5. package/dist/chunks/{agent-api-cli-DIGH1v3_.js → agent-api-cli-Bq9J0_D5.js} +148 -15
  6. package/dist/chunks/{agent-api-core-D49OzKho.js → agent-api-core-ClU9-5K3.js} +9 -3
  7. package/dist/chunks/{agent-setup-cli-7hG401Io.js → agent-setup-cli-BA_1AdhQ.js} +2 -2
  8. package/dist/chunks/{contracts-CucdticH.js → build-channel-qgKwNssc.js} +37 -3
  9. package/dist/chunks/{config-BLeRKmn9.js → config-BqJTnPae.js} +16 -33
  10. package/dist/chunks/{config-path-core-DFt-TemS.js → config-path-core-DUWk0Lui.js} +5 -1
  11. package/dist/chunks/config-store-5xpRLHFo.js +1 -0
  12. package/dist/chunks/{config-store-CXLnauAa.js → config-store-BGTg8oKO.js} +77 -78
  13. package/dist/chunks/{git-version-C3lznLS_.js → git-version-BpdkKH2j.js} +1 -1
  14. package/dist/chunks/{grok-Di4aQGre.js → grok-7jK8ZNtf.js} +1 -1
  15. package/dist/chunks/{json-file-DFCTvPjj.js → json-file-BjFK_eSH.js} +2 -7
  16. package/dist/chunks/{main-CX9CkTDx.js → main-x9ygUnoL.js} +1030 -988
  17. package/dist/chunks/{pair-cli-BPyh48--.js → pair-cli-Cph4TZ2R.js} +2 -2
  18. package/dist/chunks/{remote-config-B0zBDBak.js → remote-config-CmP36r_s.js} +2 -2
  19. package/dist/chunks/{rtk-resolver-BDHi6RMv.js → rtk-resolver-C_IReILP.js} +1 -1
  20. package/dist/chunks/rtk-resolver-DgnNb1or.js +1 -0
  21. package/dist/chunks/{session-CUc6d7aS.js → session-BwlLY_mv.js} +36 -14
  22. package/dist/chunks/{session-routes--hrsvv7a.js → session-routes-CviNvxcz.js} +9 -1
  23. package/dist/chunks/{settings-cli-DzIasX94.js → settings-cli-Bete5oVk.js} +11 -10
  24. package/dist/chunks/{settings-readout-core-BOv6tqdK.js → settings-readout-core-CS8MPaIE.js} +14 -8
  25. package/dist/chunks/shown-files-core-soMzCQ1D.js +145 -0
  26. package/dist/chunks/{ssh-sign-cli-C_QYhDvI.js → ssh-sign-cli-DXhuqzuy.js} +2 -2
  27. package/dist/client/assets/action-status-BwqYb9eF.js +1 -0
  28. package/dist/client/assets/action-status-BwqYb9eF.js.br +0 -0
  29. package/dist/client/assets/benchmark-panel-BulIdLtq.js +1 -0
  30. package/dist/client/assets/benchmark-panel-BulIdLtq.js.br +0 -0
  31. package/dist/client/assets/card-dom-DkZgkeG9.js +1 -0
  32. package/dist/client/assets/card-dom-DkZgkeG9.js.br +0 -0
  33. package/dist/client/assets/control-ws-CAcwW-r9.js +4 -0
  34. package/dist/client/assets/control-ws-CAcwW-r9.js.br +0 -0
  35. package/dist/client/assets/dialogs-CCP1ipXD.js +79 -0
  36. package/dist/client/assets/dialogs-CCP1ipXD.js.br +0 -0
  37. package/dist/client/assets/dom-helpers-xJduxDcc.js +1 -0
  38. package/dist/client/assets/dom-helpers-xJduxDcc.js.br +0 -0
  39. package/dist/client/assets/hooks-panel-BWDeSHtM.js +1 -0
  40. package/dist/client/assets/hooks-panel-BWDeSHtM.js.br +0 -0
  41. package/dist/client/assets/index-D6m--U7B.js +84 -0
  42. package/dist/client/assets/index-D6m--U7B.js.br +0 -0
  43. package/dist/client/assets/index-DF3BLGk9.css +2 -0
  44. package/dist/client/assets/index-DF3BLGk9.css.br +0 -0
  45. package/dist/client/assets/issues-panel-B7Y1Lpyx.js +1 -0
  46. package/dist/client/assets/issues-panel-B7Y1Lpyx.js.br +0 -0
  47. package/dist/client/assets/modal-mWl2H7A_.js +1 -0
  48. package/dist/client/assets/modal-mWl2H7A_.js.br +0 -0
  49. package/dist/client/assets/plan-face-DpzZfVeG.js +3 -0
  50. package/dist/client/assets/plan-face-DpzZfVeG.js.br +0 -0
  51. package/dist/client/assets/{poll-ago-ItO-gOWA.js → poll-ago-Bc-8mMFj.js} +1 -1
  52. package/dist/client/assets/poll-ago-Bc-8mMFj.js.br +0 -0
  53. package/dist/client/assets/pr-scope-tabs-DftvVYU8.js +1 -0
  54. package/dist/client/assets/pr-scope-tabs-DftvVYU8.js.br +0 -0
  55. package/dist/client/assets/radar-panel-hxjF7m9Z.js +1 -0
  56. package/dist/client/assets/radar-panel-hxjF7m9Z.js.br +0 -0
  57. package/dist/client/assets/review-queue-panel-8bP8Q7RR.js +10 -0
  58. package/dist/client/assets/review-queue-panel-8bP8Q7RR.js.br +0 -0
  59. package/dist/client/assets/roving-keys-core-BDobx2It.js +1 -0
  60. package/dist/client/assets/settings-panel-B50lNcrt.js +4 -0
  61. package/dist/client/assets/settings-panel-B50lNcrt.js.br +0 -0
  62. package/dist/client/assets/trace-panel-Dy-fgi9c.js +2 -0
  63. package/dist/client/assets/trace-panel-Dy-fgi9c.js.br +0 -0
  64. package/dist/client/assets/ui-prefs-CNf6fId2.js +1 -0
  65. package/dist/client/assets/ui-prefs-CNf6fId2.js.br +0 -0
  66. package/dist/client/assets/usage-panel-D2JuiQ4G.js +1 -0
  67. package/dist/client/assets/usage-panel-D2JuiQ4G.js.br +0 -0
  68. package/dist/client/assets/visions-panel-CI6CRn42.js +1 -0
  69. package/dist/client/assets/visions-panel-CI6CRn42.js.br +0 -0
  70. package/dist/client/index.html +14 -8
  71. package/dist/client/index.html.br +0 -0
  72. package/dist/server/index.js +99 -1
  73. package/dist/session/guardrails-open-launcher.js +28 -16
  74. package/dist/session/visions-relay.js +1 -1
  75. package/package.json +1 -1
  76. package/dist/chunks/config-store-DlaaBY9p.js +0 -1
  77. package/dist/chunks/rtk-resolver-Dr4iJsiS.js +0 -1
  78. package/dist/client/assets/action-status-DrMQzohk.js +0 -1
  79. package/dist/client/assets/action-status-DrMQzohk.js.br +0 -0
  80. package/dist/client/assets/benchmark-panel-D09qvrAY.js +0 -1
  81. package/dist/client/assets/benchmark-panel-D09qvrAY.js.br +0 -0
  82. package/dist/client/assets/dom-helpers-CZ8NZKxw.js +0 -4
  83. package/dist/client/assets/dom-helpers-CZ8NZKxw.js.br +0 -0
  84. package/dist/client/assets/hooks-panel-R-L7DuIz.js +0 -1
  85. package/dist/client/assets/hooks-panel-R-L7DuIz.js.br +0 -0
  86. package/dist/client/assets/index-B7TvZo7W.js +0 -173
  87. package/dist/client/assets/index-B7TvZo7W.js.br +0 -0
  88. package/dist/client/assets/index-C3nOrTwM.css +0 -2
  89. package/dist/client/assets/index-C3nOrTwM.css.br +0 -0
  90. package/dist/client/assets/issues-panel-CyB4oq9Z.js +0 -1
  91. package/dist/client/assets/issues-panel-CyB4oq9Z.js.br +0 -0
  92. package/dist/client/assets/modal-M_mJ8--V.js +0 -1
  93. package/dist/client/assets/modal-M_mJ8--V.js.br +0 -0
  94. package/dist/client/assets/poll-ago-ItO-gOWA.js.br +0 -0
  95. package/dist/client/assets/pr-queue-columns-Cu3-PADL.js +0 -1
  96. package/dist/client/assets/pr-queue-columns-Cu3-PADL.js.br +0 -0
  97. package/dist/client/assets/radar-panel-Cl3yPWed.js +0 -1
  98. package/dist/client/assets/radar-panel-Cl3yPWed.js.br +0 -0
  99. package/dist/client/assets/review-queue-panel-CVujzadC.js +0 -2
  100. package/dist/client/assets/review-queue-panel-CVujzadC.js.br +0 -0
  101. package/dist/client/assets/settings-panel-DW5An8lQ.js +0 -3
  102. package/dist/client/assets/settings-panel-DW5An8lQ.js.br +0 -0
  103. package/dist/client/assets/trace-panel-B6TiM5pb.js +0 -1
  104. package/dist/client/assets/trace-panel-B6TiM5pb.js.br +0 -0
  105. package/dist/client/assets/ui-prefs-CQHZFVx6.js +0 -1
  106. package/dist/client/assets/ui-prefs-CQHZFVx6.js.br +0 -0
  107. package/dist/client/assets/usage-panel-D2RX3LtG.js +0 -1
  108. package/dist/client/assets/usage-panel-D2RX3LtG.js.br +0 -0
  109. package/dist/client/assets/visions-panel-BV9EKCBw.js +0 -1
  110. package/dist/client/assets/visions-panel-BV9EKCBw.js.br +0 -0
@@ -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-CUc6d7aS.js";
5
+ import { n as glimmervoidHomeDir, t as decideConfigPath } from "../chunks/config-path-core-DUWk0Lui.js";
6
+ import { t as AGENT_API_VERBS } from "../chunks/session-BwlLY_mv.js";
6
7
  import { i as execSync } from "../chunks/child-process-safe-D4hyVIXj.js";
7
- import { r as agentCommandHelpLines } from "../chunks/agent-api-core-D49OzKho.js";
8
+ import { r as agentCommandHelpLines } from "../chunks/agent-api-core-ClU9-5K3.js";
8
9
  import { t as renderTable } from "../chunks/ascii-figure-core-pDAwtlKO.js";
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-C3lznLS_.js";
10
+ import { i as parseCommandLine, r as gitDoctorRows, t as probeGitVersion } from "../chunks/git-version-BpdkKH2j.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-BPyh48--.js");
68
+ const { runPairCli } = await import("../chunks/pair-cli-Cph4TZ2R.js");
69
69
  return runPairCli(subcommandArgs);
70
70
  }],
71
71
  ["agent", async (subcommandArgs) => {
72
- const { runAgentSetupCli } = await import("../chunks/agent-setup-cli-7hG401Io.js");
72
+ const { runAgentSetupCli } = await import("../chunks/agent-setup-cli-BA_1AdhQ.js");
73
73
  return runAgentSetupCli(subcommandArgs);
74
74
  }],
75
75
  ["settings", async (subcommandArgs) => {
76
- const { runSettingsCli } = await import("../chunks/settings-cli-DzIasX94.js");
76
+ const { runSettingsCli } = await import("../chunks/settings-cli-Bete5oVk.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-C_QYhDvI.js");
84
+ const { runSshSignCli } = await import("../chunks/ssh-sign-cli-DXhuqzuy.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-DdrR2vnB.js");
90
+ const { runAgentApiCli } = await import("../chunks/agent-api-cli-B0l8uLos.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-DdrR2vnB.js");
104
+ const { sessionLimitsHelpLines } = await import("../chunks/agent-api-cli-B0l8uLos.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-DlaaBY9p.js");
161
+ const { loadConfigFile } = await import("../chunks/config-store-5xpRLHFo.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-BGuI5U_-.js");
237
+ const { listAgentIds, describeAgentResolvability, setCustomAgents } = await import("../chunks/adapters-CPaysZkO.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-7hG401Io.js");
245
+ const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-BA_1AdhQ.js");
246
246
  const grokSetup = inspectGrokAgentSetup();
247
247
  line("grok hook setup", `${grokSetup.classification}: ${grokSetup.filePath}`);
248
248
  } catch (err) {
@@ -250,7 +250,7 @@ async function runDoctor() {
250
250
  }
251
251
  switchSection("rtk");
252
252
  try {
253
- const { getRtkPath } = await import("../chunks/rtk-resolver-Dr4iJsiS.js");
253
+ const { getRtkPath } = await import("../chunks/rtk-resolver-DgnNb1or.js");
254
254
  line("rtk", getRtkPath() || "not installed (Glimmervoid installs it when the rtk setting is on)");
255
255
  } catch (err) {
256
256
  line("rtk", `probe failed: ${firstLine(errorText(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-7hG401Io.js");
262
+ const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-BA_1AdhQ.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,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-CUc6d7aS.js";
2
+ import { Bt as FULL_SHA_RE, Ht as shortSha$1 } from "./session-BwlLY_mv.js";
3
3
  import { n as execFileAsync, r as execFileSync } from "./child-process-safe-D4hyVIXj.js";
4
- import { S as InstallFlavor } from "./config-BLeRKmn9.js";
5
- import { o as supervisionLine } from "./session-routes--hrsvv7a.js";
4
+ import { b as InstallFlavor, mt as UpdateChannel } from "./config-BqJTnPae.js";
5
+ import { o as supervisionLine } from "./session-routes-CviNvxcz.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-Di4aQGre.js";
9
+ import { i as isSpinnerChar, n as classifyAgentTitle, r as isBrailleChar, s as buildAgentEnv, t as grok } from "./grok-7jK8ZNtf.js";
10
10
  import { t as buildHookCommand } from "./hook-command-core-qTNK-xMF.js";
11
- import "./contracts-CucdticH.js";
11
+ import { n as isExperimentalBuild, t as compareReleaseVersions } from "./build-channel-qgKwNssc.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";
@@ -411,8 +411,7 @@ var NODE_PTY_INSTALL_SCRIPT_FLAG = "--allow-scripts=node-pty";
411
411
  var NPX_CACHE_DIRECTORY_NAME = "_npx";
412
412
  var CLONE_COMMAND = "git pull --ff-only && npm ci && npm run build";
413
413
  var INSTALL_FLAVORS = new Set(InstallFlavor.options);
414
- var TAG_VERSION_RE = /^v(\d+\.\d+\.\d+)$/;
415
- var UPDATE_CHANNELS = /* @__PURE__ */ new Set(["release", "main"]);
414
+ var TAG_VERSION_RE = /^v(\d+\.\d+\.\d+(?:-next\.\d+)?)$/;
416
415
  var DEPRECATION_MESSAGE_MAX_CHARS = 500;
417
416
  function normalizeSha(value) {
418
417
  if (typeof value !== "string") return null;
@@ -486,7 +485,7 @@ function buildUpdateCommand(flavor, latestVersion, platform) {
486
485
  }
487
486
  function buildReleaseUrl(version) {
488
487
  const releaseVersion = textOr(version, null);
489
- if (!releaseVersion) return null;
488
+ if (!releaseVersion || isExperimentalBuild(releaseVersion)) return null;
490
489
  return `https://github.com/${REPO_SLUG}/releases/tag/v${releaseVersion}`;
491
490
  }
492
491
  function parseVersionTriple(version) {
@@ -522,6 +521,15 @@ function parseRegistryLatest(doc) {
522
521
  sha: normalizeSha(registryDocument.gitHead)
523
522
  };
524
523
  }
524
+ function pickNewestPublished(...publishedVersions) {
525
+ let newest = null;
526
+ for (const published of publishedVersions) {
527
+ if (!published) continue;
528
+ if (newest && compareReleaseVersions(published.version, newest.version) <= 0) continue;
529
+ newest = published;
530
+ }
531
+ return newest;
532
+ }
525
533
  function parseRegistryDeprecation(doc) {
526
534
  if (!doc || typeof doc !== "object") return null;
527
535
  const deprecated = doc.deprecated;
@@ -535,30 +543,23 @@ function normalizeFlavor(flavor) {
535
543
  return "unknown";
536
544
  }
537
545
  function normalizeUpdateChannel(channel) {
538
- if (typeof channel === "string" && UPDATE_CHANNELS.has(channel)) return channel;
539
- return "release";
540
- }
541
- function normalizeBehindCount(value) {
542
- if (!Number.isInteger(value)) return null;
543
- const count = Number(value);
544
- if (count < 0) return null;
545
- return count;
546
+ const parsed = UpdateChannel.safeParse(channel);
547
+ return parsed.success ? parsed.data : "release";
546
548
  }
547
549
  function decideUpdateReason({ isReleaseAlreadyCheckedOut, reason }) {
548
550
  if (isReleaseAlreadyCheckedOut) return "release-already-checked-out";
549
551
  return textOr(reason, null);
550
552
  }
551
- function decideUpdateStatus({ installedSha, latestSha: remoteSha, currentVersion, latestVersion, flavor, platform, channel, behindCount, reason, isLatestReleaseAncestorOfHead, deprecation } = {}) {
553
+ function decideUpdateStatus({ installedSha, latestSha: remoteSha, currentVersion, latestVersion, flavor, platform, channel, reason, isLatestReleaseAncestorOfHead, deprecation } = {}) {
552
554
  const currentSha = normalizeSha(installedSha);
553
555
  const latestSha = normalizeSha(remoteSha);
554
556
  const current = textOr(currentVersion, null);
555
557
  const latest = textOr(latestVersion, null);
556
558
  const normalizedFlavor = normalizeFlavor(flavor);
557
- const normalizedChannel = normalizeUpdateChannel(channel);
558
- const normalizedBehindCount = normalizeBehindCount(behindCount);
559
- const isReleaseAlreadyCheckedOut = normalizedChannel === "release" && normalizedFlavor === "clone" && isLatestReleaseAncestorOfHead === true && compareSemver(latest, current) > 0;
559
+ const isTargetInCheckout = normalizedFlavor === "clone" && isLatestReleaseAncestorOfHead === true && compareReleaseVersions(latest, current) > 0;
560
+ const isReleaseAlreadyCheckedOut = isTargetInCheckout && !isExperimentalBuild(latest);
560
561
  return {
561
- updateAvailable: normalizedChannel === "main" ? normalizedBehindCount !== null && normalizedBehindCount > 0 && currentSha !== latestSha : !isReleaseAlreadyCheckedOut && compareSemver(latest, current) > 0,
562
+ updateAvailable: !isTargetInCheckout && compareReleaseVersions(latest, current) > 0,
562
563
  current,
563
564
  latest,
564
565
  currentSha,
@@ -566,8 +567,7 @@ function decideUpdateStatus({ installedSha, latestSha: remoteSha, currentVersion
566
567
  releaseUrl: buildReleaseUrl(latest),
567
568
  command: buildUpdateCommand(flavor, latest, platform),
568
569
  flavor: normalizedFlavor,
569
- channel: normalizedChannel,
570
- behindCount: normalizedBehindCount,
570
+ channel: normalizeUpdateChannel(channel),
571
571
  reason: decideUpdateReason({
572
572
  isReleaseAlreadyCheckedOut,
573
573
  reason
@@ -1102,4 +1102,4 @@ function resetCommandCache() {
1102
1102
  resolvedCommands.clear();
1103
1103
  }
1104
1104
  //#endregion
1105
- export { dedupeCodexFiles as A, shouldPersistWarehouse as B, shortSha as C, codexSessionIdFromPath as D, codexRootCandidates as E, passOutcome as F, claudeCode as H, projectDirCandidates as I, resolveProjectsDirs as L, grokHomes as M, grokRootCandidates as N, continuationDelayMs as O, isUsageFile as P, scopedClaudeRoots as R, parseResolvedSha as S, codexHomes as T, splitLines as V, isCheckFresh as _, describeAgentResolvability as a, parseRegistryDeprecation as b, isKnownAgentId as c, resolveAdapter as d, setCustomAgents as f, decideUpdateStatus as g, decideInstallFlavor as h, customAgentFingerprint as i, expandTilde as j, decideFileRead as k, listAgentIds as l, readHostCodexVersion as m, cachedAgentResolvability as n, getAdapter as o, codex as p, commandFor as r, hookProfileOf as s, DEFAULT_AGENT_ID as t, resetCommandCache as u, normalizeSha as v, codexFallbackRoots as w, parseRegistryLatest as x, normalizeUpdateChannel as y, shouldEvaluateDespiteIoFailures as z };
1105
+ export { decideFileRead as A, shouldEvaluateDespiteIoFailures as B, pickNewestPublished as C, codexRootCandidates as D, codexHomes as E, isUsageFile as F, splitLines as H, passOutcome as I, projectDirCandidates as L, expandTilde as M, grokHomes as N, codexSessionIdFromPath as O, grokRootCandidates as P, resolveProjectsDirs as R, parseResolvedSha as S, codexFallbackRoots as T, claudeCode as U, shouldPersistWarehouse as V, isCheckFresh as _, describeAgentResolvability as a, parseRegistryDeprecation as b, isKnownAgentId as c, resolveAdapter as d, setCustomAgents as f, decideUpdateStatus as g, decideInstallFlavor as h, customAgentFingerprint as i, dedupeCodexFiles as j, continuationDelayMs as k, listAgentIds as l, readHostCodexVersion as m, cachedAgentResolvability as n, getAdapter as o, codex as p, commandFor as r, hookProfileOf as s, DEFAULT_AGENT_ID as t, resetCommandCache as u, normalizeSha as v, shortSha as w, parseRegistryLatest as x, normalizeUpdateChannel as y, scopedClaudeRoots as z };
@@ -1 +1 @@
1
- export { a as describeAgentResolvability, l as listAgentIds, f as setCustomAgents } from "./adapters-D99c4zCx.js";
1
+ export { a as describeAgentResolvability, l as listAgentIds, f as setCustomAgents } from "./adapters-BE9BKVW0.js";
@@ -1 +1 @@
1
- export { t as askAgentApi, r as runAgentApiCli, i as sessionLimitsHelpLines } from "./agent-api-cli-DIGH1v3_.js";
1
+ export { t as askAgentApi, r as runAgentApiCli, i as sessionLimitsHelpLines } from "./agent-api-cli-Bq9J0_D5.js";
@@ -1,12 +1,15 @@
1
1
  import { t as errorCode } from "./text-DoirglWV.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-D49OzKho.js";
2
+ import { c as AgentLimitsReply, n as AGENT_URL_ENV } from "./session-BwlLY_mv.js";
3
+ import { i as formatSessionLimits } from "./session-routes-CviNvxcz.js";
4
+ import { f as isAgentApiVerb, t as AGENT_COMMAND_HELP } from "./agent-api-core-ClU9-5K3.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";
8
+ import { r as describeOverCap } from "./shown-files-core-soMzCQ1D.js";
9
+ import fs from "node:fs";
8
10
  import path from "node:path";
9
11
  import http from "node:http";
12
+ import { pipeline } from "node:stream";
10
13
  //#region server/agent-api-cli.ts
11
14
  var AGENT_PATH_PREFIX = "/agent/";
12
15
  var HELP_LIMITS_TIMEOUT_MS = 2e3;
@@ -109,20 +112,14 @@ async function postDirectly({ endpoint, headers, bodyText, deadline }) {
109
112
  text: await response.text()
110
113
  };
111
114
  }
112
- function postThroughGuardrailsProxy(guardrailsProxy, { endpoint, headers, bodyText, deadline }) {
113
- const proxyHeaders = guardrailsProxy.authorization ? { "proxy-authorization": guardrailsProxy.authorization } : {};
115
+ function requestOverHttp(target, deadline, sendBody) {
114
116
  return new Promise((resolve, reject) => {
115
117
  const request = http.request({
116
- host: guardrailsProxy.hostname,
117
- port: guardrailsProxy.port,
118
+ host: target.hostname,
119
+ port: target.port,
118
120
  method: "POST",
119
- path: endpoint.href,
120
- headers: {
121
- ...headers,
122
- ...proxyHeaders,
123
- host: endpoint.host,
124
- "content-length": String(Buffer.byteLength(bodyText))
125
- },
121
+ path: target.path,
122
+ headers: target.headers,
126
123
  ...deadline ? { signal: deadline } : {}
127
124
  }, (response) => {
128
125
  const chunks = [];
@@ -139,10 +136,30 @@ function postThroughGuardrailsProxy(guardrailsProxy, { endpoint, headers, bodyTe
139
136
  });
140
137
  });
141
138
  request.on("error", reject);
142
- request.end(bodyText);
139
+ sendBody(request);
143
140
  });
144
141
  }
142
+ function guardrailsProxyTarget(guardrailsProxy, endpoint, headers) {
143
+ const proxyHeaders = guardrailsProxy.authorization ? { "proxy-authorization": guardrailsProxy.authorization } : {};
144
+ return {
145
+ hostname: guardrailsProxy.hostname,
146
+ port: String(guardrailsProxy.port),
147
+ path: endpoint.href,
148
+ headers: {
149
+ ...headers,
150
+ ...proxyHeaders,
151
+ host: endpoint.host
152
+ }
153
+ };
154
+ }
155
+ function postThroughGuardrailsProxy(guardrailsProxy, { endpoint, headers, bodyText, deadline }) {
156
+ return requestOverHttp(guardrailsProxyTarget(guardrailsProxy, endpoint, {
157
+ ...headers,
158
+ "content-length": String(Buffer.byteLength(bodyText))
159
+ }), deadline, (request) => request.end(bodyText));
160
+ }
145
161
  function wasConnectionRefused(error) {
162
+ if (errorCode(error) === "ECONNREFUSED") return true;
146
163
  return errorCode(error?.cause) === "ECONNREFUSED";
147
164
  }
148
165
  async function postToAgentIngress({ endpoint, token, body, deadline = null }) {
@@ -180,12 +197,128 @@ async function sessionLimitsHelpLines({ timeoutMs = HELP_LIMITS_TIMEOUT_MS } = {
180
197
  return [HELP_LIMITS_UNKNOWN_LINE];
181
198
  }
182
199
  }
200
+ function parseShowArguments(words) {
201
+ const filePaths = [];
202
+ let caption = null;
203
+ for (let index = 0; index < words.length; index += 1) {
204
+ const word = words[index];
205
+ if (word === "--caption") {
206
+ caption = words[index + 1] ?? "";
207
+ index += 1;
208
+ continue;
209
+ }
210
+ if (word.startsWith("--caption=")) {
211
+ caption = word.slice(10);
212
+ continue;
213
+ }
214
+ filePaths.push(word);
215
+ }
216
+ if (filePaths.length === 0) return null;
217
+ return {
218
+ filePaths,
219
+ caption: caption?.trim().slice(0, 500) || null
220
+ };
221
+ }
222
+ async function statFileToShow(filePath) {
223
+ const absolutePath = path.resolve(filePath);
224
+ const stats = await fs.promises.stat(absolutePath).catch(() => null);
225
+ if (!stats?.isFile()) return `${filePath} is not a file this session can read`;
226
+ if (stats.size > 209715200) return describeOverCap(filePath, stats.size);
227
+ return {
228
+ filePath: absolutePath,
229
+ name: path.basename(absolutePath),
230
+ sizeBytes: stats.size
231
+ };
232
+ }
233
+ function showHeaders(token, file, caption) {
234
+ const headers = {
235
+ authorization: `Bearer ${token}`,
236
+ "content-type": "application/octet-stream",
237
+ "content-length": String(file.sizeBytes),
238
+ "x-glimmervoid-show-name": encodeURIComponent(file.name)
239
+ };
240
+ if (caption) headers["x-glimmervoid-show-caption"] = encodeURIComponent(caption);
241
+ return headers;
242
+ }
243
+ function streamFileBody(filePath) {
244
+ return (request) => {
245
+ pipeline(fs.createReadStream(filePath), request, (error) => {
246
+ if (error) request.destroy(error);
247
+ });
248
+ };
249
+ }
250
+ async function postFileToShow(endpoint, token, file, caption) {
251
+ const headers = showHeaders(token, file, caption);
252
+ const directTarget = {
253
+ hostname: endpoint.hostname,
254
+ port: endpoint.port,
255
+ path: `${endpoint.pathname}${endpoint.search}`,
256
+ headers
257
+ };
258
+ try {
259
+ return await requestOverHttp(directTarget, null, streamFileBody(file.filePath));
260
+ } catch (error) {
261
+ if (!wasConnectionRefused(error)) throw error;
262
+ const guardrailsProxy = decideGuardrailsProxy(process.env);
263
+ if (!guardrailsProxy) throw error;
264
+ return requestOverHttp(guardrailsProxyTarget(guardrailsProxy, endpoint, headers), null, streamFileBody(file.filePath));
265
+ }
266
+ }
267
+ function replyError(replyText) {
268
+ const reply = parseJsonOrNull(replyText);
269
+ const error = typeof reply === "object" && reply !== null ? reply.error : null;
270
+ return typeof error === "string" ? error : `Glimmervoid answered ${replyText || "nothing"}`;
271
+ }
272
+ async function runShowCommand(words) {
273
+ const request = parseShowArguments(words);
274
+ if (!request) {
275
+ console.error(AGENT_COMMAND_HELP.show.missingArgumentHint ?? "glimmervoid show: this command needs a file path");
276
+ return 1;
277
+ }
278
+ const target = sessionEndpoint("show");
279
+ if (!target.ok) {
280
+ console.error(target.error);
281
+ return 1;
282
+ }
283
+ const filesToShow = [];
284
+ for (const filePath of request.filePaths) {
285
+ const checked = await statFileToShow(filePath);
286
+ if (typeof checked === "string") {
287
+ console.log(JSON.stringify({
288
+ ok: false,
289
+ error: checked,
290
+ shown: []
291
+ }));
292
+ return 1;
293
+ }
294
+ filesToShow.push(checked);
295
+ }
296
+ const shown = [];
297
+ for (const file of filesToShow) {
298
+ const reply = await postFileToShow(target.endpoint, target.token, file, request.caption);
299
+ if (!reply.hasSuccessStatus || !bodySaysOk(reply.text)) {
300
+ console.log(JSON.stringify({
301
+ ok: false,
302
+ error: replyError(reply.text),
303
+ shown
304
+ }));
305
+ return 1;
306
+ }
307
+ shown.push(parseJsonOrNull(reply.text)?.shown ?? { name: file.name });
308
+ }
309
+ console.log(JSON.stringify({
310
+ ok: true,
311
+ shown
312
+ }));
313
+ return 0;
314
+ }
183
315
  async function runAgentApiCli(args) {
184
316
  const verb = args[0];
185
317
  if (!verb || !isAgentApiVerb(verb)) {
186
318
  console.error(`glimmervoid: ${verb || "that"} is not an agent command`);
187
319
  return 1;
188
320
  }
321
+ if (verb === "show") return runShowCommand(args.slice(1));
189
322
  const body = BODY_BUILDERS[verb](args.slice(1));
190
323
  if (!body) {
191
324
  console.error(AGENT_COMMAND_HELP[verb].missingArgumentHint ?? `glimmervoid ${verb}: this command needs an argument`);
@@ -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-CUc6d7aS.js";
2
- import { D as pullRequestKeyFromReference, c as TASK_TITLE_SOURCE_PRIORITY, o as PersistedTaskTitle } from "./config-BLeRKmn9.js";
3
- import { n as NO_OWN_WORKTREE_REASON, t as COMMAND_ROUTES } from "./session-routes--hrsvv7a.js";
1
+ import { 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, w as RefinedTaskTitle, z as TASK_TITLE_CONTROL_CHARACTERS } from "./session-BwlLY_mv.js";
2
+ import { T as pullRequestKeyFromReference, c as TASK_TITLE_SOURCE_PRIORITY, o as PersistedTaskTitle } from "./config-BqJTnPae.js";
3
+ import { n as NO_OWN_WORKTREE_REASON, t as COMMAND_ROUTES } from "./session-routes-CviNvxcz.js";
4
4
  import path from "node:path";
5
5
  import crypto from "node:crypto";
6
6
  //#region shared/session-naming.ts
@@ -565,6 +565,7 @@ var REQUEST_PARSERS = Object.freeze({
565
565
  board: parseEmptyBody,
566
566
  push: parseEmptyBody,
567
567
  edit: bodyParser(AgentEditRequest),
568
+ show: parseEmptyBody,
568
569
  limits: parseEmptyBody,
569
570
  review: parsePullRequestBody,
570
571
  reviews: parseEmptyBody,
@@ -751,6 +752,11 @@ var AGENT_COMMAND_HELP = Object.freeze({
751
752
  summary: "Open a text file for the operator to edit in the dashboard",
752
753
  missingArgumentHint: "glimmervoid edit: this command needs a file path, for example \"glimmervoid edit drafts/post.md\""
753
754
  },
755
+ show: {
756
+ usage: "show <path>... [--caption <text>]",
757
+ summary: "Show the operator an image, video or HTML page on this session's card",
758
+ missingArgumentHint: "glimmervoid show: this command needs a file path, for example \"glimmervoid show out/diagram.png --caption 'the new layout'\""
759
+ },
754
760
  review: {
755
761
  usage: "review <pr>",
756
762
  summary: "Queue a team review of a pull request; the draft waits in the Reviews tab for the operator to post",
@@ -1,6 +1,6 @@
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-Di4aQGre.js";
3
- import { p as writeTextAtomicSync } from "./json-file-DFCTvPjj.js";
2
+ import { a as classifyGrokHooksFile, o as renderGrokHooksFile, t as grok } from "./grok-7jK8ZNtf.js";
3
+ import { p as writeTextAtomicSync } from "./json-file-BjFK_eSH.js";
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
6
  //#region server/agent-setup-cli.ts
@@ -1,5 +1,5 @@
1
- import "./session-CUc6d7aS.js";
2
- import { C as ONBOARDING_STEPS, E as OPERATOR_SURFACES, T as OPERATOR_ACTIONS_BY_SURFACE, n as BUILTIN_AGENT_IDS, w as ONBOARDING_STEP_STATES, x as DASHBOARD_VIEWS } from "./config-BLeRKmn9.js";
1
+ import "./session-BwlLY_mv.js";
2
+ import { C as OPERATOR_ACTIONS_BY_SURFACE, S as ONBOARDING_STEP_STATES, n as BUILTIN_AGENT_IDS, w as OPERATOR_SURFACES, x as ONBOARDING_STEPS, y as DASHBOARD_VIEWS } from "./config-BqJTnPae.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"]);
@@ -18,6 +18,7 @@ var SESSION_EXIT_KINDS = Object.freeze([
18
18
  var TEAM_REVIEW_SETTLED_OUTCOMES = Object.freeze([
19
19
  "approve",
20
20
  "comment",
21
+ "request-changes",
21
22
  "approve-only",
22
23
  "discarded"
23
24
  ]);
@@ -347,4 +348,37 @@ z.object({
347
348
  projects: z.array(z.string()).optional()
348
349
  }).passthrough();
349
350
  //#endregion
350
- export { parseDataClientMessage as a, PendingCrashReport as c, TelemetryState as d, parseDataAttach as i, TELEMETRY_EVENT_SCHEMAS as l, HookEnvelope as n, DashboardTelemetryReport as o, DEEP_HISTORY_SCROLLBACK_LINES as r, FeatureFlagsResponse as s, HTTP_URL_RE as t, TELEMETRY_KILL_SWITCH_FLAG as u };
351
+ //#region shared/build-channel.ts
352
+ var RELEASE_VERSION_RE = /^v?(\d+)\.(\d+)\.(\d+)(?:-next\.(\d+))?$/;
353
+ function parseReleaseVersion(version) {
354
+ if (typeof version !== "string") return null;
355
+ const matched = RELEASE_VERSION_RE.exec(version.trim());
356
+ if (!matched) return null;
357
+ return {
358
+ core: [
359
+ Number(matched[1]),
360
+ Number(matched[2]),
361
+ Number(matched[3])
362
+ ],
363
+ experimentalBuildNumber: matched[4] === void 0 ? null : Number(matched[4])
364
+ };
365
+ }
366
+ function compareExperimentalBuildNumbers(a, b) {
367
+ if (a === b) return 0;
368
+ if (a === null) return 1;
369
+ if (b === null) return -1;
370
+ return Math.sign(a - b);
371
+ }
372
+ function compareReleaseVersions(a, b) {
373
+ const left = parseReleaseVersion(a);
374
+ const right = parseReleaseVersion(b);
375
+ if (!left || !right) return 0;
376
+ for (let i = 0; i < 3; i += 1) if (left.core[i] !== right.core[i]) return Math.sign(left.core[i] - right.core[i]);
377
+ return compareExperimentalBuildNumbers(left.experimentalBuildNumber, right.experimentalBuildNumber);
378
+ }
379
+ function isExperimentalBuild(version) {
380
+ const parsed = parseReleaseVersion(version);
381
+ return parsed !== null && parsed.experimentalBuildNumber !== null;
382
+ }
383
+ //#endregion
384
+ export { DEEP_HISTORY_SCROLLBACK_LINES as a, DashboardTelemetryReport as c, TELEMETRY_EVENT_SCHEMAS as d, TELEMETRY_KILL_SWITCH_FLAG as f, HookEnvelope as i, FeatureFlagsResponse as l, isExperimentalBuild as n, parseDataAttach as o, TelemetryState as p, HTTP_URL_RE as r, parseDataClientMessage as s, compareReleaseVersions as t, PendingCrashReport as u };