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.
- package/README.md +1 -1
- package/dist/bin/glimmervoid.js +33 -42
- package/dist/chunks/{adapters-CAHxZYT3.js → adapters-B6tbX3Aj.js} +27 -14
- package/dist/chunks/{adapters-DDjC7_vG.js → adapters-CXQfLoyj.js} +1 -1
- package/dist/chunks/agent-api-cli-BBech5lF.js +1 -0
- package/dist/chunks/{agent-api-cli-B5Tm0wXO.js → agent-api-cli-BNHJTmNW.js} +44 -77
- package/dist/chunks/agent-api-core-DDrJQEdE.js +304 -0
- package/dist/chunks/{agent-setup-cli-DmMfCw5O.js → agent-setup-cli-CeBBwKuL.js} +2 -2
- package/dist/chunks/config-store-BZpN2djp.js +1 -0
- package/dist/chunks/{config-store-BUNZs4j7.js → config-store-DqMScSdg.js} +82 -268
- package/dist/chunks/contracts-CloExMlS.js +680 -0
- package/dist/chunks/{contracts-HVCEJfxs.js → control-messages-DpBaniJi.js} +1275 -1021
- package/dist/chunks/{git-version-rWZjF2Px.js → git-version-CJQMfxtZ.js} +2 -2
- package/dist/chunks/{grok-B6bsCgdd.js → grok-BLzhApwT.js} +7 -8
- package/dist/chunks/{guardrails-deps-Cb-ki4EU.js → guardrails-deps-CLxK4J-g.js} +1 -1
- package/dist/chunks/{json-file-CIJf0Cel.js → json-file-DFCTvPjj.js} +3 -7
- package/dist/chunks/{main-BNSbP-Yk.js → main-DDU8IvFD.js} +28791 -31978
- package/dist/chunks/{pair-cli-DNp8i5L4.js → pair-cli-CsOVTQGJ.js} +2 -2
- package/dist/chunks/{remote-config-C_s2pnLC.js → remote-config-HlABuLTp.js} +2 -2
- package/dist/chunks/{session-BlT68ppa.js → session-BwB43SCa.js} +119 -71
- package/dist/chunks/{session-routes-CT1JrjoT.js → session-routes-DNJzsckH.js} +25 -10
- package/dist/chunks/{settings-cli-BbzxCyG5.js → settings-cli-DkkbK-dj.js} +30 -156
- package/dist/chunks/settings-readout-core-DrXT4aWm.js +201 -0
- package/dist/chunks/{ssh-sign-cli-C74BGTQS.js → ssh-sign-cli-CYeKRevK.js} +2 -2
- package/dist/client/assets/index-BK9jLR47.js +148 -0
- package/dist/client/assets/index-CU_uqJmi.css +2 -0
- package/dist/client/assets/xterm-kR64YvZ-.js +79 -0
- package/dist/client/assets/zod-BRLv4KqJ.js +55 -0
- package/dist/client/index.html +7 -3
- package/dist/scripts/postinstall-path-check.js +21 -3
- package/dist/server/index.js +1 -1
- package/package.json +3 -4
- package/dist/chunks/agent-api-cli-BDu1CxZf.js +0 -1
- package/dist/chunks/agent-api-core-B_mUSenR.js +0 -341
- package/dist/chunks/browser-config-BrBT8269.js +0 -762
- package/dist/chunks/config-CjawSOBk.js +0 -219
- package/dist/chunks/config-store-MAVQhGMh.js +0 -1
- package/dist/chunks/factory-D7ryES9n.js +0 -240
- package/dist/chunks/knowledge-graph-cli-ByUJoKw_.js +0 -1354
- package/dist/client/assets/index-B5uVtedd.css +0 -1
- 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 {
|
|
6
|
-
import { b as
|
|
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: [
|
|
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-
|
|
1739
|
+
id: "lanes-coherence",
|
|
1888
1740
|
level: "lanes",
|
|
1889
|
-
|
|
1890
|
-
|
|
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: "
|
|
1895
|
-
path: "
|
|
1896
|
-
title: "
|
|
1897
|
-
description: "
|
|
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
|
-
"
|
|
1902
|
-
"
|
|
1903
|
-
"
|
|
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,
|
|
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
|
|
3799
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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 {
|
|
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 };
|