glimmervoid 0.38.2 → 0.40.0

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 (41) hide show
  1. package/README.md +1 -1
  2. package/dist/bin/glimmervoid.js +33 -42
  3. package/dist/chunks/{adapters-CAHxZYT3.js → adapters-B6tbX3Aj.js} +27 -14
  4. package/dist/chunks/{adapters-DDjC7_vG.js → adapters-CXQfLoyj.js} +1 -1
  5. package/dist/chunks/agent-api-cli-BBech5lF.js +1 -0
  6. package/dist/chunks/{agent-api-cli-B5Tm0wXO.js → agent-api-cli-BNHJTmNW.js} +44 -77
  7. package/dist/chunks/agent-api-core-DDrJQEdE.js +304 -0
  8. package/dist/chunks/{agent-setup-cli-DmMfCw5O.js → agent-setup-cli-CeBBwKuL.js} +2 -2
  9. package/dist/chunks/config-store-BZpN2djp.js +1 -0
  10. package/dist/chunks/{config-store-BUNZs4j7.js → config-store-DqMScSdg.js} +82 -268
  11. package/dist/chunks/contracts-CloExMlS.js +680 -0
  12. package/dist/chunks/{contracts-HVCEJfxs.js → control-messages-DpBaniJi.js} +1275 -1021
  13. package/dist/chunks/{git-version-rWZjF2Px.js → git-version-CJQMfxtZ.js} +2 -2
  14. package/dist/chunks/{grok-B6bsCgdd.js → grok-BLzhApwT.js} +7 -8
  15. package/dist/chunks/{guardrails-deps-Cb-ki4EU.js → guardrails-deps-CLxK4J-g.js} +1 -1
  16. package/dist/chunks/{json-file-CIJf0Cel.js → json-file-DFCTvPjj.js} +3 -7
  17. package/dist/chunks/{main-BNSbP-Yk.js → main-DDU8IvFD.js} +28791 -31978
  18. package/dist/chunks/{pair-cli-DNp8i5L4.js → pair-cli-CsOVTQGJ.js} +2 -2
  19. package/dist/chunks/{remote-config-C_s2pnLC.js → remote-config-HlABuLTp.js} +2 -2
  20. package/dist/chunks/{session-BlT68ppa.js → session-BwB43SCa.js} +119 -71
  21. package/dist/chunks/{session-routes-CT1JrjoT.js → session-routes-DNJzsckH.js} +25 -10
  22. package/dist/chunks/{settings-cli-BbzxCyG5.js → settings-cli-DkkbK-dj.js} +30 -156
  23. package/dist/chunks/settings-readout-core-DrXT4aWm.js +201 -0
  24. package/dist/chunks/{ssh-sign-cli-C74BGTQS.js → ssh-sign-cli-CYeKRevK.js} +2 -2
  25. package/dist/client/assets/index-BK9jLR47.js +148 -0
  26. package/dist/client/assets/index-CU_uqJmi.css +2 -0
  27. package/dist/client/assets/xterm-kR64YvZ-.js +79 -0
  28. package/dist/client/assets/zod-BRLv4KqJ.js +55 -0
  29. package/dist/client/index.html +7 -3
  30. package/dist/scripts/postinstall-path-check.js +21 -3
  31. package/dist/server/index.js +1 -1
  32. package/package.json +3 -4
  33. package/dist/chunks/agent-api-cli-BDu1CxZf.js +0 -1
  34. package/dist/chunks/agent-api-core-B_mUSenR.js +0 -341
  35. package/dist/chunks/browser-config-BrBT8269.js +0 -762
  36. package/dist/chunks/config-CjawSOBk.js +0 -219
  37. package/dist/chunks/config-store-MAVQhGMh.js +0 -1
  38. package/dist/chunks/factory-D7ryES9n.js +0 -240
  39. package/dist/chunks/knowledge-graph-cli-ByUJoKw_.js +0 -1354
  40. package/dist/client/assets/index-B5uVtedd.css +0 -1
  41. package/dist/client/assets/index-b13-NGGS.js +0 -275
@@ -1,11 +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 USAGE_BUDGET_RANGE, A as FLYING_ANIMALS_DEFAULTS, B as POSTHOG_FIX_TIMEOUT_RANGE, F as MEMORY_RESERVE_MB_RANGE, I as NON_NEGATIVE_NUMBER_RANGE, J as POSTHOG_TRAFFIC_MIN_USERS_RANGE, K as POSTHOG_TRAFFIC_BASELINE_RANGE, L as PORT_RANGE, M as FLYING_ANIMALS_GAP_RANGE, N as FLYING_ANIMALS_SCALE_RANGE, P as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, Q as TASK_TITLE_TIMEOUT_RANGE, R as POSITIVE_NUMBER_RANGE, Y as POSTHOG_TRAFFIC_MULTIPLIER_RANGE, Z as REPLAY_BUFFER_KB_RANGE, et as USAGE_INTEGER_RANGES, j as FLYING_ANIMALS_DURATION_RANGE, k as CHANGE_MAP_NARRATOR_TIMEOUT_RANGE, lt as WORKFLOWS_MAX_ACTIONS_PER_POLL_RANGE, nt as USAGE_SCAN_INTERVAL_RANGE, tt as USAGE_RETAIN_DAYS_RANGE, ut as WORKFLOWS_MAX_CONCURRENT_SESSIONS_RANGE } from "./control-messages-DpBaniJi.js";
3
4
  import { n as glimmervoidHomeDir$1, t as decideConfigPath } from "./config-path-core-DFt-TemS.js";
4
5
  import { n as isRecord } from "./coerce-NSst8oRP.js";
5
- import { A as FLYING_ANIMALS_DURATION_RANGE, B as POSTHOG_TRAFFIC_MIN_USERS_RANGE, D as CHANGE_MAP_NARRATOR_TIMEOUT_RANGE, E as normalizeLegacyConfigNumbers, F as NON_NEGATIVE_NUMBER_RANGE, G as USAGE_INTEGER_RANGES, H as REPLAY_BUFFER_KB_RANGE, I as PORT_RANGE, J as WORKFLOWS_MAX_ACTIONS_PER_POLL_RANGE, K as USAGE_RETAIN_DAYS_RANGE, L as POSITIVE_NUMBER_RANGE, M as FLYING_ANIMALS_SCALE_RANGE, N as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, O as FACTORY_MAX_LIVE_WORKERS_RANGE, P as MEMORY_RESERVE_MB_RANGE, R as POSTHOG_FIX_TIMEOUT_RANGE, U as TASK_TITLE_TIMEOUT_RANGE, V as POSTHOG_TRAFFIC_MULTIPLIER_RANGE, W as USAGE_BUDGET_RANGE, Y as WORKFLOWS_MAX_CONCURRENT_SESSIONS_RANGE, a as DEFAULT_FACTORY_CHECKS, j as FLYING_ANIMALS_GAP_RANGE, k as FLYING_ANIMALS_DEFAULTS, m as UPDATE_CHANNELS, n as BranchGcFileSettings, o as DEFAULT_FACTORY_PROTECTED_PATHS, q as USAGE_SCAN_INTERVAL_RANGE, r as CHANGE_MAP_NARRATOR_ENGINES, u as POST_TURN_CHECK_MODES, w as USAGE_COST_MODES, z as POSTHOG_TRAFFIC_BASELINE_RANGE } from "./browser-config-BrBT8269.js";
6
- import { b as DEFAULT_CHECK_MEMORY_RESERVE_MB, d as writeJsonAtomicSync, f as writeTextAtomic, p as writeTextAtomicSync } from "./json-file-CIJf0Cel.js";
7
- import { c as RUNTIME_CONFIG_SCALAR_KEYS, i as Config, n as BUILTIN_AGENT_IDS, t as AGENT_ID_SHAPE_MESSAGE, u as configIssueMessage } from "./config-CjawSOBk.js";
8
- import { K as TELEMETRY_KILL_SWITCH_FLAG, U as FeatureFlagsResponse } from "./contracts-HVCEJfxs.js";
6
+ import { d as writeJsonAtomicSync, f as writeTextAtomic, p as writeTextAtomicSync } from "./json-file-DFCTvPjj.js";
7
+ import { C as UPDATE_CHANNELS, E as normalizeLegacyConfigNumbers, S as POST_TURN_CHECK_MODES, _ as RUNTIME_CONFIG_SCALAR_KEYS, b as BranchGcFileSettings, d as AGENT_ID_SHAPE_MESSAGE, f as BUILTIN_AGENT_IDS, l as TELEMETRY_KILL_SWITCH_FLAG, m as Config, o as FeatureFlagsResponse, w as USAGE_COST_MODES, x as CHANGE_MAP_NARRATOR_ENGINES, y as configIssueMessage } from "./contracts-CloExMlS.js";
9
8
  import fs from "node:fs";
10
9
  import path from "node:path";
11
10
  import os from "node:os";
@@ -574,15 +573,6 @@ function decideIsDevInstall({ installFlavor, isBundled, homeDir, defaultHomeDir
574
573
  if (installFlavor === "clone" || !isBundled) return true;
575
574
  return comparablePath(homeDir) !== comparablePath(defaultHomeDir);
576
575
  }
577
- function buildFactoryDecisionEvent(decision) {
578
- return {
579
- kind: decision.kind,
580
- outcome: decision.outcome,
581
- failure_class: decision.failureClass,
582
- duration_ms: decision.durationMs,
583
- attempt: decision.attempt
584
- };
585
- }
586
576
  function nodeMajorVersion(nodeVersion) {
587
577
  const major = Number.parseInt(nodeVersion.replace(/^v/, ""), 10);
588
578
  return Number.isFinite(major) ? major : 0;
@@ -632,10 +622,6 @@ var SESSIONS = {
632
622
  label: "sessions",
633
623
  storedPerDisplay: 1
634
624
  };
635
- var WORKERS = {
636
- label: "workers",
637
- storedPerDisplay: 1
638
- };
639
625
  var RECURRENCES = {
640
626
  label: "recurrences",
641
627
  storedPerDisplay: 1
@@ -711,7 +697,6 @@ var DIAGNOSTIC = "A diagnostic switch kept out of the Settings view; change it i
711
697
  var PROCESS_SETTING = "Changes how the server process or its worktrees behave, so it is set in config.json with a restart or new sessions in mind.";
712
698
  var STRUCTURED_VALUE = "A structured value with no dashboard control; edit it in config.json.";
713
699
  var BY_RULE = "Never editable from the dashboard by rule; edit it in config.json.";
714
- var LANES_SECTION_ID = "lanes";
715
700
  function capitalizedOptions(values) {
716
701
  return values.map((value) => ({
717
702
  value,
@@ -755,20 +740,6 @@ var SECTIONS = Object.freeze([
755
740
  defaultValue: "phyrexian",
756
741
  ...BROWSER_NOW
757
742
  },
758
- {
759
- id: "compact-status",
760
- path: "pref:compactStatusLabels",
761
- title: "Hide status words in sidebar",
762
- description: "Hide status words in the sidebar and on the phone Board while keeping the colored status mark and the phone Plan ready badge.",
763
- control: "toggle",
764
- keywords: [
765
- "sidebar",
766
- "status",
767
- "compact"
768
- ],
769
- defaultValue: false,
770
- ...BROWSER_NOW
771
- },
772
743
  {
773
744
  id: "session-usage-chips",
774
745
  path: "pref:sessionUsageChips",
@@ -785,6 +756,23 @@ var SECTIONS = Object.freeze([
785
756
  defaultValue: false,
786
757
  ...BROWSER_NOW
787
758
  },
759
+ {
760
+ id: "phone-arrow-pad",
761
+ path: "pref:phoneArrowPad",
762
+ title: "Swipe arrow pad on phone (experimental)",
763
+ description: "Replace the four arrow keys above the phone keyboard with one pad: swipe on it to send arrow keys, one per short drag.",
764
+ control: "toggle",
765
+ keywords: [
766
+ "experimental",
767
+ "mobile",
768
+ "keys",
769
+ "arrows",
770
+ "swipe",
771
+ "gesture"
772
+ ],
773
+ defaultValue: false,
774
+ ...BROWSER_NOW
775
+ },
788
776
  {
789
777
  id: "flying-animals",
790
778
  path: "pref:flyingAnimalsEnabled",
@@ -955,7 +943,7 @@ var SECTIONS = Object.freeze([
955
943
  id: "telegram-bot-token",
956
944
  path: "telegram.botToken",
957
945
  title: "Bot token",
958
- description: "Credential used by the shared Telegram bot. When GLIMMERVOID_TELEGRAM_BOT_TOKEN supplies it, this field is read-only.",
946
+ description: "Credential used by the shared Telegram bot. Create a bot by messaging @BotFather in Telegram and sending /newbot; it replies with this token. When GLIMMERVOID_TELEGRAM_BOT_TOKEN supplies it, this field is read-only.",
959
947
  control: "password",
960
948
  keywords: ["credential", "api"],
961
949
  defaultValue: "",
@@ -965,7 +953,7 @@ var SECTIONS = Object.freeze([
965
953
  id: "telegram-chat-id",
966
954
  path: "telegram.chatId",
967
955
  title: "Chat id",
968
- description: "Destination chat for enabled Telegram lanes.",
956
+ description: "Destination chat for enabled Telegram lanes. Send your bot any message, then open https://api.telegram.org/bot<token>/getUpdates in a browser and copy the number under message.chat.id.",
969
957
  control: "text",
970
958
  keywords: ["destination", "channel"],
971
959
  defaultValue: "",
@@ -977,8 +965,13 @@ var SECTIONS = Object.freeze([
977
965
  title: "Send session notifications",
978
966
  description: "Send session completion, input and failure alerts when no dashboard is open. Unacknowledged alerts also escalate after the phone escalation delay while a dashboard remains open.",
979
967
  control: "toggle",
980
- keywords: ["phone", "off dashboard"],
968
+ keywords: [
969
+ "phone",
970
+ "off dashboard",
971
+ "test"
972
+ ],
981
973
  defaultValue: false,
974
+ status: "telegram-delivery",
982
975
  ...MACHINE_NOW
983
976
  }
984
977
  ]
@@ -1022,6 +1015,22 @@ var SECTIONS = Object.freeze([
1022
1015
  defaultValue: false,
1023
1016
  ...MACHINE_NOW
1024
1017
  },
1018
+ {
1019
+ id: "zen-view",
1020
+ path: "zenView",
1021
+ title: "Zen view (experimental)",
1022
+ description: "Add a Zen tab that shows no terminal until a session needs you, then shows only that session and what it needs.",
1023
+ control: "toggle",
1024
+ keywords: [
1025
+ "experimental",
1026
+ "calm",
1027
+ "focus",
1028
+ "attention",
1029
+ "needs you"
1030
+ ],
1031
+ defaultValue: false,
1032
+ ...MACHINE_NOW
1033
+ },
1025
1034
  {
1026
1035
  id: "streamer-mode",
1027
1036
  path: "streamerMode",
@@ -1312,20 +1321,13 @@ var SECTIONS = Object.freeze([
1312
1321
  }
1313
1322
  ]
1314
1323
  },
1315
- {
1316
- id: LANES_SECTION_ID,
1317
- level: "lanes",
1318
- title: "Lanes",
1319
- description: "The background work Glimmervoid runs for you, one sub-section per lane.",
1320
- settings: []
1321
- },
1322
1324
  {
1323
1325
  id: "lanes-visions",
1324
1326
  level: "lanes",
1325
- parent: LANES_SECTION_ID,
1326
1327
  title: "Visions",
1327
1328
  description: "Editor-buffer findings, bounded model comments, and the machine-context ingest behind them.",
1328
1329
  legacyIds: [
1330
+ "lanes",
1329
1331
  "visions",
1330
1332
  "lanes-ingest",
1331
1333
  "ingest"
@@ -1418,7 +1420,6 @@ var SECTIONS = Object.freeze([
1418
1420
  {
1419
1421
  id: "lanes-posthog",
1420
1422
  level: "lanes",
1421
- parent: LANES_SECTION_ID,
1422
1423
  title: "PostHog",
1423
1424
  description: "Error monitoring, investigations and traffic-spike alerts.",
1424
1425
  legacyIds: ["posthog"],
@@ -1531,7 +1532,6 @@ var SECTIONS = Object.freeze([
1531
1532
  {
1532
1533
  id: "lanes-team-review",
1533
1534
  level: "lanes",
1534
- parent: LANES_SECTION_ID,
1535
1535
  title: "Team review",
1536
1536
  description: "Draft reviews of teammates' pull requests for you to post from the Reviews tab.",
1537
1537
  legacyIds: ["team-review", "reviews"],
@@ -1666,7 +1666,6 @@ var SECTIONS = Object.freeze([
1666
1666
  {
1667
1667
  id: "lanes-workflows",
1668
1668
  level: "lanes",
1669
- parent: LANES_SECTION_ID,
1670
1669
  title: "Workflows",
1671
1670
  description: "Rules that act on pull request events in the repositories you choose.",
1672
1671
  legacyIds: ["workflows"],
@@ -1714,156 +1713,9 @@ var SECTIONS = Object.freeze([
1714
1713
  }
1715
1714
  ]
1716
1715
  },
1717
- {
1718
- id: "lanes-factory",
1719
- level: "lanes",
1720
- parent: LANES_SECTION_ID,
1721
- title: "Factory",
1722
- description: "Read Coherence reports from repositories whose integration branch holds a coherence.config.json and show their status in the Factory tab.",
1723
- legacyIds: ["factory"],
1724
- settings: [
1725
- {
1726
- id: "factory-enabled",
1727
- path: "factory.enabled",
1728
- title: "Enable the factory",
1729
- description: "Enable Coherence status polling and show the Factory tab. Off by default.",
1730
- control: "toggle",
1731
- keywords: [
1732
- "orchestrator",
1733
- "intents",
1734
- "queue",
1735
- "coherence",
1736
- "guardrails"
1737
- ],
1738
- defaultValue: false,
1739
- ...MACHINE_NOW
1740
- },
1741
- {
1742
- id: "factory-max-risk",
1743
- path: "factory.maxRisk",
1744
- title: "Worker risk ceiling",
1745
- description: "Highest risk admitted for a ticket.",
1746
- control: "select",
1747
- defaultValue: "medium",
1748
- options: [
1749
- "low",
1750
- "medium",
1751
- "high",
1752
- "critical"
1753
- ].map((value) => ({
1754
- value,
1755
- label: value
1756
- })),
1757
- keywords: ["risk", "admission"],
1758
- ...MACHINE_NOW
1759
- },
1760
- {
1761
- id: "factory-max-live-workers",
1762
- path: "factory.maxLiveWorkers",
1763
- title: "Live worker cap",
1764
- description: "Most live workers per factory project.",
1765
- control: "number",
1766
- range: FACTORY_MAX_LIVE_WORKERS_RANGE,
1767
- unit: WORKERS,
1768
- defaultValue: 2,
1769
- keywords: ["workers", "parallel"],
1770
- ...MACHINE_NOW
1771
- },
1772
- {
1773
- id: "factory-checks",
1774
- path: "factory.checks",
1775
- title: "Worker checks",
1776
- description: "Commands glimmervoid runs before merging worker commits.",
1777
- control: "list",
1778
- defaultValue: [
1779
- "npm run typecheck",
1780
- "npm run lint",
1781
- "npm test"
1782
- ],
1783
- keywords: ["tests", "checks"],
1784
- listPlaceholder: "npm test",
1785
- listEmptyText: "No checks run before a merge.",
1786
- ...MACHINE_NOW
1787
- },
1788
- {
1789
- id: "factory-protected-paths",
1790
- path: "factory.protectedPaths",
1791
- title: "Protected paths",
1792
- description: "Repo-relative files, directory prefixes ending in /, or **/NAME basenames workers cannot change.",
1793
- control: "list",
1794
- defaultValue: [
1795
- "coherence.config.json",
1796
- ".coherence/",
1797
- "package.json",
1798
- "package-lock.json",
1799
- "**/AGENTS.md",
1800
- "**/CLAUDE.md",
1801
- "**/CLAUDE.local.md",
1802
- ".claude/",
1803
- ".github/"
1804
- ],
1805
- keywords: ["fence", "scope"],
1806
- listPlaceholder: "path, prefix/ or **/NAME",
1807
- listEmptyText: "Workers may change any path.",
1808
- ...MACHINE_NOW
1809
- },
1810
- {
1811
- id: "factory-reviewer-model",
1812
- path: "factory.reviewerModel",
1813
- title: "Reviewer model",
1814
- description: "Claude model for independent worker review. Blank uses the CLI default.",
1815
- control: "text",
1816
- defaultValue: null,
1817
- nullable: true,
1818
- keywords: ["claude", "review"],
1819
- ...MACHINE_NOW
1820
- },
1821
- {
1822
- id: "factory-daily-budget",
1823
- path: "factory.dailyBudgetUsd",
1824
- title: "Factory daily budget",
1825
- description: "Factory lane spend ceiling. Blank means no ceiling. Needs usage tracking: with it off, dispatch refuses.",
1826
- control: "number",
1827
- range: NON_NEGATIVE_NUMBER_RANGE,
1828
- unit: USD,
1829
- integer: false,
1830
- nullable: true,
1831
- step: .01,
1832
- defaultValue: null,
1833
- keywords: ["spend", "budget"],
1834
- ...MACHINE_NOW
1835
- },
1836
- {
1837
- id: "factory-verifier-model",
1838
- path: "factory.verifierModel",
1839
- title: "Verifier model",
1840
- description: "Claude model for independent intent verification. Blank uses the CLI default.",
1841
- control: "text",
1842
- nullable: true,
1843
- defaultValue: null,
1844
- keywords: ["claude", "verification"],
1845
- ...MACHINE_NOW
1846
- },
1847
- {
1848
- id: "factory-mirror-harness-runs",
1849
- path: "factory.mirrorHarnessRuns",
1850
- title: "Mirror harness runs",
1851
- description: "Show the latest factory harness run as a read-only project in the Factory tab while it runs and for a day after. Needs factory.enabled on. The harness turns it off on the instance it boots.",
1852
- control: "toggle",
1853
- defaultValue: true,
1854
- keywords: [
1855
- "harness",
1856
- "test",
1857
- "read-only"
1858
- ],
1859
- ...MACHINE_NOW
1860
- }
1861
- ]
1862
- },
1863
1716
  {
1864
1717
  id: "lanes-benchmarks",
1865
1718
  level: "lanes",
1866
- parent: LANES_SECTION_ID,
1867
1719
  title: "Benchmarks",
1868
1720
  description: "Compare agent setups on frozen cases from the suites in the benchmarks folder of the Glimmervoid home.",
1869
1721
  legacyIds: ["benchmarks"],
@@ -1884,25 +1736,21 @@ var SECTIONS = Object.freeze([
1884
1736
  }]
1885
1737
  },
1886
1738
  {
1887
- id: "lanes-knowledge-graph",
1739
+ id: "lanes-coherence",
1888
1740
  level: "lanes",
1889
- parent: LANES_SECTION_ID,
1890
- title: "Knowledge graph (experimental)",
1891
- description: "A typed local graph of projects, tasks, notes, references and questions, driven from the glimmervoid kg command. Its SQLite database defaults to the Glimmervoid home; --db selects another path.",
1892
- legacyIds: ["knowledge-graph"],
1741
+ title: "Coherence (experimental)",
1742
+ description: "Per-session Coherence hook status and decision journal for agent sessions.",
1893
1743
  settings: [{
1894
- id: "knowledge-graph-enabled",
1895
- path: "knowledgeGraph.enabled",
1896
- title: "Enable the knowledge graph",
1897
- description: "Allow the glimmervoid kg command. It reads Coherence ledgers to report where your tasks and the agents' tickets disagree, without modifying those ledgers. Graph writes go to the selected SQLite database, which can be inside a repository when --db names that path. Off by default.",
1744
+ id: "coherence-enabled",
1745
+ path: "coherence.enabled",
1746
+ title: "Show session Coherence",
1747
+ description: "Shows each session's Coherence hook status and decision journal when the repository installed @posthog/coherence 1.8 or newer. Off by default.",
1898
1748
  control: "toggle",
1899
1749
  keywords: [
1900
1750
  "experimental",
1901
- "kg",
1902
- "tasks",
1903
- "notes",
1904
- "references",
1905
- "coherence"
1751
+ "coherence",
1752
+ "journal",
1753
+ "decisions"
1906
1754
  ],
1907
1755
  defaultValue: false,
1908
1756
  ...MACHINE_NOW
@@ -1911,7 +1759,6 @@ var SECTIONS = Object.freeze([
1911
1759
  {
1912
1760
  id: "lanes-change-map",
1913
1761
  level: "lanes",
1914
- parent: LANES_SECTION_ID,
1915
1762
  title: "Change map",
1916
1763
  description: "Optional model narration for deterministic change facts.",
1917
1764
  legacyIds: ["change-map"],
@@ -1963,7 +1810,7 @@ var SECTIONS = Object.freeze([
1963
1810
  id: "telemetry-enabled",
1964
1811
  path: "telemetry.enabled",
1965
1812
  title: "Send anonymous usage and error data",
1966
- 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, and factory outcomes as the kind of decision, how it came out, its duration and attempt number, 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.",
1813
+ 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.",
1967
1814
  control: "toggle",
1968
1815
  keywords: [
1969
1816
  "telemetry",
@@ -2034,24 +1881,6 @@ var FILE_ONLY_SETTINGS = Object.freeze([
2034
1881
  fileOnlyReason: TUNING_KNOB,
2035
1882
  ...FILE_ONLY
2036
1883
  },
2037
- {
2038
- id: "file-check-memory-reserve",
2039
- path: "checkMemoryReserveMB",
2040
- title: "Check run memory reserve",
2041
- group: "machine-sessions",
2042
- description: "Free memory a factory check run waits for; 0 runs checks without checking.",
2043
- control: "number",
2044
- range: MEMORY_RESERVE_MB_RANGE,
2045
- unit: {
2046
- label: "MB",
2047
- storedPerDisplay: 1
2048
- },
2049
- keywords: ["memory", "factory"],
2050
- defaultValue: 1500,
2051
- takesEffect: "now",
2052
- fileOnlyReason: TUNING_KNOB,
2053
- ...FILE_ONLY
2054
- },
2055
1884
  {
2056
1885
  id: "file-cursor-blink",
2057
1886
  path: "cursorBlink",
@@ -3540,11 +3369,11 @@ var DEFAULT_CONFIG = {
3540
3369
  debugMode: false,
3541
3370
  conversationView: false,
3542
3371
  streamerMode: false,
3372
+ zenView: false,
3543
3373
  detectBackgroundAgents: true,
3544
3374
  detectScheduledWakeups: true,
3545
3375
  replayBufferKB: 512,
3546
3376
  sessionMemoryReserveMB: 600,
3547
- checkMemoryReserveMB: DEFAULT_CHECK_MEMORY_RESERVE_MB,
3548
3377
  recordSignals: true,
3549
3378
  trace: { enabled: true },
3550
3379
  planReview: { enabled: true },
@@ -3560,17 +3389,6 @@ var DEFAULT_CONFIG = {
3560
3389
  model: "",
3561
3390
  timeoutSeconds: 90
3562
3391
  } },
3563
- factory: {
3564
- enabled: false,
3565
- maxRisk: "medium",
3566
- maxLiveWorkers: 2,
3567
- checks: DEFAULT_FACTORY_CHECKS,
3568
- protectedPaths: DEFAULT_FACTORY_PROTECTED_PATHS,
3569
- reviewerModel: null,
3570
- dailyBudgetUsd: null,
3571
- verifierModel: null,
3572
- mirrorHarnessRuns: true
3573
- },
3574
3392
  guardrails: {
3575
3393
  unguardedRepos: [],
3576
3394
  blockedPaths: [],
@@ -3649,7 +3467,7 @@ function resolveConfigPath() {
3649
3467
  }, (candidate) => fs.existsSync(candidate));
3650
3468
  if (decided.path) return decided.path;
3651
3469
  if (decided.source === "env") {
3652
- console.error(`Config file not found: ${decided.envPath}`);
3470
+ console.error(`Config file not found: ${decided.envPath}, the path GLIMMERVOID_CONFIG names. Create that file, or unset GLIMMERVOID_CONFIG to use ${decided.homePath}.`);
3653
3471
  process.exit(1);
3654
3472
  }
3655
3473
  const homeConfig = decided.homePath;
@@ -3795,11 +3613,14 @@ function isSuspectedExternalWipe(candidate, currentConfig) {
3795
3613
  branchGc: resolveBranchGc(candidate.branchGc)
3796
3614
  }) * 2 < currentKeyCount;
3797
3615
  }
3798
- function warnInvalidConfig(action, validation) {
3799
- console.warn(`[config] Refusing to ${action}; validation failed: ${validation.errors.join("; ")}. Recovery sources: config.json.bak and config.json.boot.bak.`);
3616
+ function invalidConfigWarning(action, validation) {
3617
+ return `[config] Refusing to ${action}; validation failed: ${validation.errors.join("; ")}. Recovery sources: config.json.bak and config.json.boot.bak.`;
3618
+ }
3619
+ function suspectedWipeWarning(action) {
3620
+ return `[config] Refusing to ${action}; config.json has fewer than half the top-level keys of the in-memory config. This looks like an external wipe. Recovery sources: config.json.bak and config.json.boot.bak.`;
3800
3621
  }
3801
3622
  function warnSuspectedWipe(action) {
3802
- console.warn(`[config] Refusing to ${action}; config.json has fewer than half the top-level keys of the in-memory config. This looks like an external wipe. Recovery sources: config.json.bak and config.json.boot.bak.`);
3623
+ console.warn(suspectedWipeWarning(action));
3803
3624
  }
3804
3625
  function ensureProjectIds(projects) {
3805
3626
  let changed = false;
@@ -3879,36 +3700,30 @@ function createConfigStore({ settingsDefaults } = {}) {
3879
3700
  let synchronousWriteRevision = 0;
3880
3701
  let lastSynchronousContent = null;
3881
3702
  let pendingSaves = Promise.resolve();
3703
+ let lastSaveFailureReason = null;
3704
+ function refuseSave(warning, operatorReason = warning.replace(/^\[config\] /, "")) {
3705
+ console.warn(warning);
3706
+ lastSaveFailureReason = operatorReason;
3707
+ return null;
3708
+ }
3882
3709
  function prepareSave(freshConfig, mutatorFn) {
3883
3710
  const freshValidation = validateConfig(freshConfig);
3884
- if (!freshValidation.ok) {
3885
- warnInvalidConfig("save config.json", freshValidation);
3886
- return null;
3887
- }
3888
- if (isSuspectedExternalWipe(freshConfig, config)) {
3889
- warnSuspectedWipe("save config.json");
3890
- return null;
3891
- }
3711
+ if (!freshValidation.ok) return refuseSave(invalidConfigWarning("save config.json", freshValidation));
3712
+ if (isSuspectedExternalWipe(freshConfig, config)) return refuseSave(suspectedWipeWarning("save config.json"));
3892
3713
  if (mutatorFn(freshConfig) === "abort-config-save") return null;
3893
3714
  const mutatedValidation = validateConfig(withEnvSecrets(freshConfig, envSecrets));
3894
- if (!mutatedValidation.ok) {
3895
- warnInvalidConfig("save config.json", mutatedValidation);
3896
- return null;
3897
- }
3715
+ if (!mutatedValidation.ok) return refuseSave(invalidConfigWarning("save config.json", mutatedValidation));
3898
3716
  return mutatedValidation.config;
3899
3717
  }
3900
3718
  function save(mutatorFn) {
3719
+ lastSaveFailureReason = null;
3901
3720
  let loaded;
3902
3721
  try {
3903
3722
  loaded = loadConfigFile(configPath, { exitOnError: false });
3904
3723
  } catch (err) {
3905
- console.warn("[config] Failed to read config.json for save:", errorLabel(err));
3906
- return null;
3907
- }
3908
- if ("error" in loaded) {
3909
- console.warn(loaded.message);
3910
- return null;
3724
+ return refuseSave(`[config] Failed to read config.json for save: ${errorLabel(err)}`);
3911
3725
  }
3726
+ if ("error" in loaded) return refuseSave(loaded.message, `${configPath} could not be read as a config file. The broken file was copied to ${loaded.invalidBackupPath} when possible. Fix it, or restore from ${configPath}.bak, then save again.`);
3912
3727
  const freshConfig = loaded.config;
3913
3728
  const freshContent = loaded.loadedContent;
3914
3729
  const effectiveConfig = prepareSave(freshConfig, mutatorFn);
@@ -3922,8 +3737,7 @@ function createConfigStore({ settingsDefaults } = {}) {
3922
3737
  lastSynchronousContent = nextContent;
3923
3738
  synchronousWriteRevision++;
3924
3739
  } catch (err) {
3925
- console.warn("[config] Failed to write config.json:", errorLabel(err));
3926
- return null;
3740
+ return refuseSave(`[config] Failed to write config.json: ${errorLabel(err)}`);
3927
3741
  }
3928
3742
  return effectiveConfig;
3929
3743
  }
@@ -3992,6 +3806,7 @@ function createConfigStore({ settingsDefaults } = {}) {
3992
3806
  debugMode: config.debugMode ?? effectiveDefaults.debugMode,
3993
3807
  conversationView: config.conversationView ?? effectiveDefaults.conversationView,
3994
3808
  streamerMode: config.streamerMode ?? effectiveDefaults.streamerMode,
3809
+ zenView: config.zenView ?? effectiveDefaults.zenView,
3995
3810
  detectBackgroundAgents: config.detectBackgroundAgents ?? effectiveDefaults.detectBackgroundAgents,
3996
3811
  recordSignals: config.recordSignals ?? effectiveDefaults.recordSignals,
3997
3812
  trace: pickBlock("trace", {
@@ -4028,8 +3843,7 @@ function createConfigStore({ settingsDefaults } = {}) {
4028
3843
  github: pickBlock("github", config.github),
4029
3844
  teamReview: pickBlock("teamReview", config.teamReview),
4030
3845
  benchmarks: pickBlock("benchmarks", config.benchmarks),
4031
- factory: pickBlock("factory", config.factory),
4032
- knowledgeGraph: pickBlock("knowledgeGraph", config.knowledgeGraph),
3846
+ coherence: pickBlock("coherence", config.coherence),
4033
3847
  workflows: config.workflows ?? null,
4034
3848
  posthog: pickBlock("posthog", config.posthog),
4035
3849
  secretSources: secretSourcesOf(process.env),
@@ -4076,8 +3890,7 @@ function createConfigStore({ settingsDefaults } = {}) {
4076
3890
  if (newConfig.github != null) config.github = newConfig.github;
4077
3891
  if (newConfig.teamReview != null) config.teamReview = newConfig.teamReview;
4078
3892
  if (newConfig.benchmarks != null) config.benchmarks = newConfig.benchmarks;
4079
- if (newConfig.factory != null) config.factory = newConfig.factory;
4080
- if (newConfig.knowledgeGraph != null) config.knowledgeGraph = newConfig.knowledgeGraph;
3893
+ if (newConfig.coherence != null) config.coherence = newConfig.coherence;
4081
3894
  if (newConfig.posthog != null) config.posthog = newConfig.posthog;
4082
3895
  if (newConfig.usage != null) config.usage = newConfig.usage;
4083
3896
  if (newConfig.telegram != null) config.telegram = newConfig.telegram;
@@ -4147,6 +3960,7 @@ function createConfigStore({ settingsDefaults } = {}) {
4147
3960
  configPath,
4148
3961
  save,
4149
3962
  saveAsync,
3963
+ lastSaveFailureReason: () => lastSaveFailureReason,
4150
3964
  idle: () => pendingSaves,
4151
3965
  getSettings,
4152
3966
  applySettings,
@@ -4156,4 +3970,4 @@ function createConfigStore({ settingsDefaults } = {}) {
4156
3970
  };
4157
3971
  }
4158
3972
  //#endregion
4159
- export { withEnvSecrets as $, settingsOf as A, buildExceptionProperties as B, deleteValueAtPath as C, scoreSettingsSearch as D, parsePosthogProjectSelection as E, TELEMETRY_BATCH_URL as F, decideTelemetryConsent as G, classifySessionExit as H, TELEMETRY_FLAGS_URL as I, parsePosthogReleaseId as J, exceptionFingerprint as K, adapterBucket as L, FILE_ONLY_GROUPS as M, SETTINGS_REGISTRY as N, setValueAtPath as O, FIRST_RUN_NOTICE as P, stableConfigKey as Q, buildAiGenerationEvents as R, cloneValue as S, hasScaledUnit as T, decideIsDevInstall as U, buildFactoryDecisionEvent as V, decideRemoteTelemetryState as W, ENV_SECRET_BINDINGS as X, resolveProjectToken as Y, readEnvSecrets as Z, SECRET_PRESENCE_SUFFIX as _, generateProjectId as a, usablePrefixes as at, validateSettingsBlock as b, resolveConfigPath as c, comparableDirectoryPath as ct, assetForPlatform as d, DEFAULT_BRANCH_GC_PREFIXES as et, decideRtkInstall as f, verifyDigest as g, isRtkBinaryName as h, ensureProjectIds as i, sessionIdFromBranch as it, valueAtPath as j, settingsGroupOf as k, saveConfigFileOnce as l, isSameDirectoryPath as lt, installTargetPath as m, DEFAULT_CONFIG as n, planBranchGc as nt, glimmervoidHomeDir as o, worktreeIntegrationTips as ot, findEscapingArchiveMember as p, nodeMajorVersion as q, createConfigStore as r, planWorktreeGc as rt, loadConfigFile as s, canonicalizePath as st, ABORT_CONFIG_SAVE as t, matchedPrefix as tt, validateConfig as u, mergeSettingsBlock as v, displayText as w, SETTINGS_INDEX as x, settingsBlockSpecFor as y, buildBrowserExceptionProperties as z };
3973
+ 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 };