glimmervoid 0.32.1 → 0.34.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 (29) hide show
  1. package/README.md +1 -1
  2. package/dist/bin/glimmervoid.js +15 -10
  3. package/dist/chunks/{adapters-BS_7o8fj.js → adapters-BY8slY95.js} +3 -3
  4. package/dist/chunks/{adapters-Bn-dQ02i.js → adapters-_HwpLy0R.js} +1 -1
  5. package/dist/chunks/agent-api-cli-CRJYxzVU.js +2 -0
  6. package/dist/chunks/{agent-api-cli-BR0GVDn6.js → agent-api-cli-DuT7437B.js} +3 -3
  7. package/dist/chunks/{agent-api-core-DUiWHSHg.js → agent-api-core-Ddg15j2j.js} +1 -1
  8. package/dist/chunks/{agent-setup-cli-BqYcwfOs.js → agent-setup-cli-CFielF2o.js} +1 -1
  9. package/dist/chunks/{config-B6BkTOcE.js → config-DTwMFUjx.js} +14 -20
  10. package/dist/chunks/config-store-BmdXeUz1.js +2 -0
  11. package/dist/chunks/{config-store-aZpWeX92.js → config-store-CggAQLUB.js} +17 -11
  12. package/dist/chunks/{contracts-DzDg-Z9I.js → contracts-D1wLN5iO.js} +3 -41
  13. package/dist/chunks/{grok-7Z5KcgcY.js → grok-BYKnBgdr.js} +2 -1
  14. package/dist/chunks/{knowledge-graph-cli-D5Gf87Y7.js → knowledge-graph-cli-BBE3R9DJ.js} +1 -1
  15. package/dist/chunks/{main-BG6iHwoY.js → main-Dh4udE7P.js} +1223 -1107
  16. package/dist/chunks/{pair-cli-DQkrt_-s.js → pair-cli-Nnrd0il_.js} +2 -2
  17. package/dist/chunks/{remote-config-Da4C7tMG.js → remote-config-DKMQEIZh.js} +1 -1
  18. package/dist/chunks/{sandbox-deps-DuaNFq7n.js → sandbox-deps-C63o3mZs.js} +4 -4
  19. package/dist/chunks/{session-Dtkp9o3r.js → session-C7rstCmA.js} +15 -1
  20. package/dist/chunks/ssh-sign-cli-SWtTF00D.js +133 -0
  21. package/dist/chunks/ssh-signing-core-CRhVVWNW.js +49 -0
  22. package/dist/client/assets/index-BiTwrj1H.js +254 -0
  23. package/dist/client/index.html +1 -1
  24. package/dist/scripts/postinstall-path-check.js +1 -1
  25. package/dist/server/index.js +1 -1
  26. package/dist/session/sandbox-open-launcher.js +2 -1
  27. package/package.json +1 -1
  28. package/dist/chunks/config-store-C8Ry8ZFD.js +0 -2
  29. package/dist/client/assets/index-Co4S7tnh.js +0 -254
package/README.md CHANGED
@@ -57,7 +57,7 @@ Update a clone with `git pull --ff-only && npm ci && npm run build`, then restar
57
57
  - **Claude Code CLI** on PATH, or another supported agent below.
58
58
  - **git** on PATH, for per-session worktrees.
59
59
  - **Linux only:** `build-essential` and `python3` for node-pty.
60
- - **Linux only:** `bubblewrap` (`bwrap`), `socat` and `ripgrep` (`rg`) for the sandbox that sandboxed sessions and factory checks run in (`sudo apt install bubblewrap socat ripgrep`). `glimmervoid doctor` reports all three.
60
+ - **Linux only:** `bubblewrap` (`bwrap`), `socat` and `ripgrep` (`rg`) for the sandbox runtime behind session guardrails and factory checks (`sudo apt install bubblewrap socat ripgrep`). `glimmervoid doctor` reports all three.
61
61
 
62
62
  ## Supported agents
63
63
 
@@ -2,11 +2,11 @@
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 { a as packageRoot } from "../chunks/runtime-paths-BPoxENmK.js";
5
- import { t as AGENT_API_VERBS } from "../chunks/session-Dtkp9o3r.js";
5
+ import { t as AGENT_API_VERBS } from "../chunks/session-C7rstCmA.js";
6
6
  import { i as execSync } from "../chunks/child-process-safe-DDELk9XC.js";
7
7
  import { t as renderTable } from "../chunks/ascii-figure-core-pDAwtlKO.js";
8
8
  import { n as glimmervoidHomeDir, t as decideConfigPath } from "../chunks/config-path-core-DFt-TemS.js";
9
- import { i as sandboxDoctorRows, r as probeSandboxDependencies } from "../chunks/sandbox-deps-DuaNFq7n.js";
9
+ import { i as sandboxDoctorRows, r as probeSandboxDependencies } from "../chunks/sandbox-deps-C63o3mZs.js";
10
10
  import { r as gitDoctorRows, t as probeGitVersion } from "../chunks/git-version-CrLW4a6r.js";
11
11
  import { i as pnpmGlobalBinDir, n as npmGlobalBinDir, r as onPath, t as formatPathNotice } from "../chunks/path-doctor-C23VAqeu.js";
12
12
  import fs from "node:fs";
@@ -109,6 +109,7 @@ Commands:
109
109
  board From inside a Glimmervoid session, list the live sessions
110
110
  push From inside a Glimmervoid session, land its commits on the integration branch and push it
111
111
  edit <path> From inside a Glimmervoid session, surface a text file for the operator to edit in the dashboard
112
+ ssh-sign What git runs inside a Glimmervoid session to sign a commit with the operator's forwarded ssh agent
112
113
  kg [command] Experimental typed knowledge and task graph (Settings > Lanes > Knowledge graph)
113
114
 
114
115
  Options:
@@ -134,23 +135,27 @@ var SUBCOMMAND_RUNNERS = new Map([
134
135
  return 0;
135
136
  }],
136
137
  ["pair", async (subcommandArgs) => {
137
- const { runPairCli } = await import("../chunks/pair-cli-DQkrt_-s.js");
138
+ const { runPairCli } = await import("../chunks/pair-cli-Nnrd0il_.js");
138
139
  return runPairCli(subcommandArgs);
139
140
  }],
140
141
  ["agent", async (subcommandArgs) => {
141
- const { runAgentSetupCli } = await import("../chunks/agent-setup-cli-BqYcwfOs.js");
142
+ const { runAgentSetupCli } = await import("../chunks/agent-setup-cli-CFielF2o.js");
142
143
  return runAgentSetupCli(subcommandArgs);
143
144
  }],
144
145
  ["kg", async (subcommandArgs) => {
145
- const { runKnowledgeGraphCommand } = await import("../chunks/knowledge-graph-cli-D5Gf87Y7.js");
146
+ const { runKnowledgeGraphCommand } = await import("../chunks/knowledge-graph-cli-BBE3R9DJ.js");
146
147
  return runKnowledgeGraphCommand(subcommandArgs);
147
148
  }],
148
149
  ["visions", async (subcommandArgs) => {
149
150
  const { runVisionsCli } = await import("../chunks/visions-cli-BhFdym5n.js");
150
151
  return runVisionsCli(subcommandArgs);
151
152
  }],
153
+ ["ssh-sign", async (subcommandArgs) => {
154
+ const { runSshSignCli } = await import("../chunks/ssh-sign-cli-SWtTF00D.js");
155
+ return runSshSignCli(subcommandArgs);
156
+ }],
152
157
  ...AGENT_API_VERBS.map((verb) => [verb, async (subcommandArgs, subcommandName) => {
153
- const { runAgentApiCli } = await import("../chunks/agent-api-cli-BR0GVDn6.js");
158
+ const { runAgentApiCli } = await import("../chunks/agent-api-cli-CRJYxzVU.js");
154
159
  return runAgentApiCli([subcommandName, ...subcommandArgs]);
155
160
  }])
156
161
  ]);
@@ -204,7 +209,7 @@ async function readDeclaredCustomAgents() {
204
209
  declared: [],
205
210
  error: null
206
211
  };
207
- const { loadConfigFile } = await import("../chunks/config-store-C8Ry8ZFD.js");
212
+ const { loadConfigFile } = await import("../chunks/config-store-BmdXeUz1.js");
208
213
  try {
209
214
  const loaded = loadConfigFile(decided.path, { exitOnError: false });
210
215
  if (!loaded.config) return {
@@ -280,7 +285,7 @@ async function runDoctor() {
280
285
  }
281
286
  switchSection("Agents");
282
287
  try {
283
- const { listAgentIds, describeAgentResolvability, setCustomAgents } = await import("../chunks/adapters-Bn-dQ02i.js");
288
+ const { listAgentIds, describeAgentResolvability, setCustomAgents } = await import("../chunks/adapters-_HwpLy0R.js");
284
289
  const declaredCustomAgents = await readDeclaredCustomAgents();
285
290
  if (declaredCustomAgents.error) line("config", declaredCustomAgents.error);
286
291
  setCustomAgents(declaredCustomAgents.declared);
@@ -288,7 +293,7 @@ async function runDoctor() {
288
293
  const { label, path: resolvedPath } = describeAgentResolvability(id);
289
294
  line(`${id} (${label})`, resolvedPath ?? "not found on PATH");
290
295
  }
291
- const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-BqYcwfOs.js");
296
+ const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-CFielF2o.js");
292
297
  const grokSetup = inspectGrokAgentSetup();
293
298
  line("grok hook setup", `${grokSetup.classification}: ${grokSetup.filePath}`);
294
299
  } catch (err) {
@@ -305,7 +310,7 @@ async function runDoctor() {
305
310
  try {
306
311
  const { resolvePackageBin } = await import("../chunks/runtime-paths-DU5jBEEO.js");
307
312
  const { execFileSync } = await import("../chunks/child-process-safe-B3zcPdFM.js");
308
- const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-BqYcwfOs.js");
313
+ const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-CFielF2o.js");
309
314
  const binPath = resolvePackageBin("cc-safety-net", "cc-safety-net");
310
315
  line("Sane YOLO", binPath || "not installed");
311
316
  if (binPath) line("cc-safety-net version", execFileSync(process.execPath, [binPath, "--version"], {
@@ -1,11 +1,11 @@
1
1
  import { o as relayPath } from "./runtime-paths-BPoxENmK.js";
2
- import { C as firstDetailLine, f as PendingPromptQuestion, u as PROMPT_DETAIL_HIDDEN_CHARACTERS, w as toolDetailFieldValue } from "./session-Dtkp9o3r.js";
2
+ import { D as firstDetailLine, O as toolDetailFieldValue, f as PendingPromptQuestion, u as PROMPT_DETAIL_HIDDEN_CHARACTERS } from "./session-C7rstCmA.js";
3
3
  import { r as execFileSync } from "./child-process-safe-DDELk9XC.js";
4
4
  import { n as resolveAgentCommand, t as buildAgentSpawnCommand } from "./spawn-command-Cc40FiZI.js";
5
5
  import { n as isRecord } from "./coerce-NSst8oRP.js";
6
- import { c as buildAgentEnv, i as isSpinnerChar, n as classifyAgentTitle, r as isBrailleChar, t as grok } from "./grok-7Z5KcgcY.js";
6
+ import { c as buildAgentEnv, i as isSpinnerChar, n as classifyAgentTitle, r as isBrailleChar, t as grok } from "./grok-BYKnBgdr.js";
7
7
  import { t as buildHookCommand } from "./hook-command-core-DclEoE9e.js";
8
- import "./contracts-DzDg-Z9I.js";
8
+ import "./contracts-D1wLN5iO.js";
9
9
  import { n as mergeCodexPreToolUse, t as HOOK_TOOLS } from "./hook-tools-UX2fmt81.js";
10
10
  import fs from "node:fs";
11
11
  //#region session/adapters/claude-code.ts
@@ -1,2 +1,2 @@
1
- import { a as describeAgentResolvability, d as setCustomAgents, l as listAgentIds } from "./adapters-BS_7o8fj.js";
1
+ import { a as describeAgentResolvability, d as setCustomAgents, l as listAgentIds } from "./adapters-BY8slY95.js";
2
2
  export { describeAgentResolvability, listAgentIds, setCustomAgents };
@@ -0,0 +1,2 @@
1
+ import { n as runAgentApiCli } from "./agent-api-cli-DuT7437B.js";
2
+ export { runAgentApiCli };
@@ -1,8 +1,8 @@
1
1
  import { t as errorCode } from "./text-DoirglWV.js";
2
- import { a as AgentDispatchRequest, c as AgentTicketRequest, n as AGENT_URL_ENV } from "./session-Dtkp9o3r.js";
2
+ import { a as AgentDispatchRequest, c as AgentTicketRequest, n as AGENT_URL_ENV } from "./session-C7rstCmA.js";
3
3
  import { i as resolveHookTarget } from "./hook-relay-core-DA_bz2KA.js";
4
4
  import { n as decideSandboxProxy } from "./sandbox-proxy-core-hnQgKR0T.js";
5
- import { c as isAgentApiVerb, l as isOrchestratorAgentVerb } from "./agent-api-core-DUiWHSHg.js";
5
+ import { c as isAgentApiVerb, l as isOrchestratorAgentVerb } from "./agent-api-core-Ddg15j2j.js";
6
6
  import path from "node:path";
7
7
  import http from "node:http";
8
8
  //#region server/agent-api-cli.ts
@@ -148,4 +148,4 @@ async function runAgentApiCli(args) {
148
148
  return reply.hasSuccessStatus && bodySaysOk(reply.text) ? 0 : 1;
149
149
  }
150
150
  //#endregion
151
- export { runAgentApiCli };
151
+ export { runAgentApiCli as n, postToAgentIngress as t };
@@ -1,4 +1,4 @@
1
- import { a as AgentDispatchRequest, i as AgentAttentionRequest, l as ORCHESTRATOR_AGENT_VERBS, o as AgentEditRequest, s as AgentSpawnRequest, t as AGENT_API_VERBS } from "./session-Dtkp9o3r.js";
1
+ import { a as AgentDispatchRequest, i as AgentAttentionRequest, l as ORCHESTRATOR_AGENT_VERBS, o as AgentEditRequest, s as AgentSpawnRequest, t as AGENT_API_VERBS } from "./session-C7rstCmA.js";
2
2
  import crypto from "node:crypto";
3
3
  var MAX_SPAWNS_IN_FLIGHT = 1;
4
4
  var SPAWNABLE_DEPTH = 0;
@@ -1,5 +1,5 @@
1
1
  import { a as isMissingFileError, r as errorMessage } from "./text-DoirglWV.js";
2
- import { a as classifyGrokHooksFile, o as renderGrokHooksFile, t as grok } from "./grok-7Z5KcgcY.js";
2
+ import { a as classifyGrokHooksFile, o as renderGrokHooksFile, t as grok } from "./grok-BYKnBgdr.js";
3
3
  import { p as writeTextAtomicSync } from "./json-file-oEH9vt-0.js";
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
@@ -1,4 +1,4 @@
1
- import { x as TaskTitle } from "./session-Dtkp9o3r.js";
1
+ import { T as TaskTitle } from "./session-C7rstCmA.js";
2
2
  import { n as isRecord } from "./coerce-NSst8oRP.js";
3
3
  import path from "node:path";
4
4
  import { z } from "zod";
@@ -143,10 +143,6 @@ var CoherenceWorkCreated = z.looseObject({
143
143
  var CoherenceTicketCreated = CoherenceWorkCreated.extend({ parent: z.string().regex(/^wrk-[a-f0-9]{16}$/) });
144
144
  //#endregion
145
145
  //#region shared/settings-ranges.ts
146
- var FACTORY_WATCH_WINDOW_RANGE = Object.freeze({
147
- min: 1,
148
- max: 1440
149
- });
150
146
  var FACTORY_MAX_LIVE_WORKERS_RANGE = Object.freeze({ min: 1 });
151
147
  var POSITIVE_NUMBER_RANGE = Object.freeze({
152
148
  min: 0,
@@ -249,7 +245,6 @@ var WORKFLOWS_MAX_ACTIONS_PER_POLL_RANGE = Object.freeze({
249
245
  Object.freeze({
250
246
  NON_NEGATIVE_NUMBER_RANGE,
251
247
  FACTORY_MAX_LIVE_WORKERS_RANGE,
252
- FACTORY_WATCH_WINDOW_RANGE,
253
248
  FLYING_ANIMALS_GAP_RANGE,
254
249
  FLYING_ANIMALS_DURATION_RANGE,
255
250
  FLYING_ANIMALS_SCALE_RANGE,
@@ -1393,11 +1388,6 @@ var FactorySettings = z.object({
1393
1388
  checks: z.array(z.string().trim().min(1)).optional(),
1394
1389
  protectedPaths: z.array(z.string().trim().min(1)).optional(),
1395
1390
  reviewerModel: z.string().trim().min(1).nullable().optional(),
1396
- watchWindowMinutes: z.number().int().min(FACTORY_WATCH_WINDOW_RANGE.min).max(FACTORY_WATCH_WINDOW_RANGE.max).optional(),
1397
- watchProjects: z.array(z.object({
1398
- project: z.string().trim().min(1),
1399
- posthogProjectId: z.number().int().positive()
1400
- })).optional(),
1401
1391
  dailyBudgetUsd: z.number().finite().nonnegative().nullable().optional(),
1402
1392
  verifierModel: z.string().trim().min(1).nullable().optional(),
1403
1393
  mirrorHarnessRuns: optionalBoolean("factory.mirrorHarnessRuns")
@@ -1458,12 +1448,16 @@ var AgentApiSettings = z.object(agentApiShape, { error: "agentApi must be an obj
1458
1448
  var AgentApiFileSettings = z.object(agentApiShape, { error: "agentApi must be an object" }).passthrough().optional();
1459
1449
  var optionalPathList = (field) => z.array(z.string({ error: `${field} must be an array of paths` }).trim().min(1, { error: `${field} must be an array of paths` }), { error: `${field} must be an array of paths` }).optional();
1460
1450
  var sandboxShape = {
1461
- unconfinedRepos: optionalPathList("sandbox.unconfinedRepos"),
1462
- writablePaths: optionalPathList("sandbox.writablePaths"),
1463
- unreadablePaths: optionalPathList("sandbox.unreadablePaths")
1451
+ unguardedRepos: optionalPathList("guardrails.unguardedRepos"),
1452
+ blockedPaths: optionalPathList("guardrails.blockedPaths"),
1453
+ unreadablePaths: optionalPathList("guardrails.unreadablePaths")
1464
1454
  };
1465
- var SandboxSettings = z.object(sandboxShape, { error: "sandbox must be an object" }).strict().optional();
1466
- var SandboxFileSettings = z.object(sandboxShape, { error: "sandbox must be an object" }).passthrough().optional();
1455
+ var isHomeRelativePath = (entry) => entry === "~" || entry.startsWith("~/") || entry.startsWith("~\\");
1456
+ var createSandboxSettings = (isAbsolutePath) => z.object({
1457
+ ...sandboxShape,
1458
+ blockedPaths: z.array(z.string({ error: "guardrails.blockedPaths must be an array of paths" }).trim().min(1, { error: "guardrails.blockedPaths must be an array of paths" }).refine((entry) => isHomeRelativePath(entry) || isAbsolutePath(entry), { message: "guardrails.blockedPaths entries must be absolute paths or start with ~/" }), { error: "guardrails.blockedPaths must be an array of paths" }).optional()
1459
+ }, { error: "guardrails must be an object" }).strict().optional();
1460
+ var SandboxFileSettings = z.object(sandboxShape, { error: "guardrails must be an object" }).passthrough().optional();
1467
1461
  var telemetryShape = { enabled: optionalBoolean("telemetry.enabled") };
1468
1462
  var TelemetrySettings = z.object(telemetryShape, { error: "telemetry must be an object" }).strict().optional();
1469
1463
  var TelemetryFileSettings = z.object(telemetryShape, { error: "telemetry must be an object" }).passthrough().optional();
@@ -1506,7 +1500,7 @@ var createBrowserConfigShape = (isAbsolutePath) => ({
1506
1500
  telegram: TelegramSettings,
1507
1501
  ingest: IngestSettings,
1508
1502
  agentApi: AgentApiSettings,
1509
- sandbox: SandboxSettings,
1503
+ guardrails: createSandboxSettings(isAbsolutePath),
1510
1504
  telemetry: TelemetrySettings,
1511
1505
  workflows: WorkflowsSettings.nullable().optional()
1512
1506
  });
@@ -1603,7 +1597,7 @@ var ProjectConfig = z.object({
1603
1597
  agent: z.string({ error: "projects[].agent must be a string" }).regex(AGENT_ID_RE, { error: `projects[].agent must be ${AGENT_ID_SHAPE_MESSAGE}` }).optional(),
1604
1598
  codexBypassHookTrust: z.boolean().optional(),
1605
1599
  dangerouslySkipPermissions: z.boolean({ error: "projects[].dangerouslySkipPermissions must be a boolean" }).optional(),
1606
- unconfined: z.boolean({ error: "projects[].unconfined must be a boolean" }).optional()
1600
+ unguarded: z.boolean({ error: "projects[].unguarded must be a boolean" }).optional()
1607
1601
  }).passthrough();
1608
1602
  var FILE_CONFIG_SHAPE = {
1609
1603
  ...BROWSER_CONFIG_SHAPE,
@@ -1622,7 +1616,7 @@ var FILE_CONFIG_SHAPE = {
1622
1616
  ingest: optionalLooseObject("ingest"),
1623
1617
  workflows: optionalLooseObject("workflows"),
1624
1618
  agentApi: AgentApiFileSettings,
1625
- sandbox: SandboxFileSettings,
1619
+ guardrails: SandboxFileSettings,
1626
1620
  telemetry: TelemetryFileSettings,
1627
1621
  trace: TraceSettings,
1628
1622
  planReview: PlanReviewSettings,
@@ -1679,7 +1673,7 @@ var CONFIG_BLOCK_KEYS = Object.freeze([
1679
1673
  "telegram",
1680
1674
  "ingest",
1681
1675
  "agentApi",
1682
- "sandbox",
1676
+ "guardrails",
1683
1677
  "telemetry",
1684
1678
  "workflows",
1685
1679
  "coder"
@@ -0,0 +1,2 @@
1
+ import { c as loadConfigFile } from "./config-store-CggAQLUB.js";
2
+ export { loadConfigFile };
@@ -3,8 +3,8 @@ import { i as equalsIgnoringCaseOnWindows, t as canonicalizePath } from "./paths
3
3
  import { n as glimmervoidHomeDir$1, t as decideConfigPath } from "./config-path-core-DFt-TemS.js";
4
4
  import { a as positiveIntOr, c as textOr, n as isRecord } from "./coerce-NSst8oRP.js";
5
5
  import { d as writeJsonAtomicSync, f as writeTextAtomic, p as writeTextAtomicSync } from "./json-file-oEH9vt-0.js";
6
- import { St as normalizeLegacyConfigNumbers, f as BranchGcFileSettings, i as Config, l as configIssueMessage, m as DEFAULT_FACTORY_PROTECTED_PATHS, n as BUILTIN_AGENT_IDS, p as DEFAULT_FACTORY_CHECKS, s as RUNTIME_CONFIG_SCALAR_KEYS, t as AGENT_ID_SHAPE_MESSAGE } from "./config-B6BkTOcE.js";
7
- import { V as FeatureFlagsResponse, W as TELEMETRY_KILL_SWITCH_FLAG } from "./contracts-DzDg-Z9I.js";
6
+ import { St as normalizeLegacyConfigNumbers, f as BranchGcFileSettings, i as Config, l as configIssueMessage, m as DEFAULT_FACTORY_PROTECTED_PATHS, n as BUILTIN_AGENT_IDS, p as DEFAULT_FACTORY_CHECKS, s as RUNTIME_CONFIG_SCALAR_KEYS, t as AGENT_ID_SHAPE_MESSAGE } from "./config-DTwMFUjx.js";
7
+ import { V as FeatureFlagsResponse, W as TELEMETRY_KILL_SWITCH_FLAG } from "./contracts-D1wLN5iO.js";
8
8
  import fs from "node:fs";
9
9
  import path from "node:path";
10
10
  import os from "node:os";
@@ -1108,16 +1108,14 @@ var DEFAULT_CONFIG = {
1108
1108
  checks: DEFAULT_FACTORY_CHECKS,
1109
1109
  protectedPaths: DEFAULT_FACTORY_PROTECTED_PATHS,
1110
1110
  reviewerModel: null,
1111
- watchWindowMinutes: 30,
1112
- watchProjects: [],
1113
1111
  dailyBudgetUsd: null,
1114
1112
  verifierModel: null,
1115
1113
  mirrorHarnessRuns: false
1116
1114
  },
1117
1115
  agentApi: { enabled: false },
1118
- sandbox: {
1119
- unconfinedRepos: [],
1120
- writablePaths: ["~/.npm", "~/.cache"],
1116
+ guardrails: {
1117
+ unguardedRepos: [],
1118
+ blockedPaths: [],
1121
1119
  unreadablePaths: []
1122
1120
  },
1123
1121
  telemetry: { enabled: true },
@@ -1390,6 +1388,12 @@ function pickRedactedBlock(stored, allowedKeys, secretKeys) {
1390
1388
  }
1391
1389
  return redacted;
1392
1390
  }
1391
+ function retiredGuardrailKeysWarning(config) {
1392
+ const projects = Array.isArray(config.projects) ? config.projects : [];
1393
+ const retiredKeys = [...Object.hasOwn(config, "sandbox") ? ["sandbox (move it to guardrails, renaming unconfinedRepos to unguardedRepos)"] : [], ...projects.some((project) => isRecord(project) && Object.hasOwn(project, "unconfined")) ? ["projects[].unconfined (rename it to unguarded)"] : []];
1394
+ if (retiredKeys.length === 0) return null;
1395
+ return `[guardrails] config.json still has ${retiredKeys.join(" and ")}. These keys are ignored, so their unreadable paths and opt-outs do not apply until you move them.`;
1396
+ }
1393
1397
  function createConfigStore({ settingsDefaults } = {}) {
1394
1398
  const configPath = resolveConfigPath();
1395
1399
  const effectiveDefaults = {
@@ -1403,6 +1407,8 @@ function createConfigStore({ settingsDefaults } = {}) {
1403
1407
  writeBackupContent(`${configPath}.boot.bak`, loadedConfig.loadedContent);
1404
1408
  config.repoRoots = config.repoRoots || [];
1405
1409
  config.branchGc = resolveBranchGcAndWarn(config.branchGc);
1410
+ const retiredGuardrailKeys = retiredGuardrailKeysWarning(config);
1411
+ if (retiredGuardrailKeys !== null) console.warn(retiredGuardrailKeys);
1406
1412
  if (Array.isArray(config.projects) && ensureProjectIds(config.projects)) try {
1407
1413
  writeJsonAtomicSync(configPath, withoutEnvSecrets(config, envSecrets), { mode: 384 });
1408
1414
  console.log("[config] Auto-assigned IDs to projects missing them");
@@ -1522,9 +1528,9 @@ function createConfigStore({ settingsDefaults } = {}) {
1522
1528
  recordSignals: config.recordSignals ?? effectiveDefaults.recordSignals,
1523
1529
  trace: { enabled: config.trace?.enabled ?? DEFAULT_CONFIG.trace.enabled },
1524
1530
  agentApi: { enabled: config.agentApi?.enabled ?? DEFAULT_CONFIG.agentApi.enabled },
1525
- sandbox: {
1526
- ...DEFAULT_CONFIG.sandbox,
1527
- ...config.sandbox
1531
+ guardrails: {
1532
+ ...DEFAULT_CONFIG.guardrails,
1533
+ ...config.guardrails
1528
1534
  },
1529
1535
  telemetry: { enabled: config.telemetry?.enabled ?? DEFAULT_CONFIG.telemetry.enabled },
1530
1536
  telemetryForcedOff: isTelemetryForcedOff(process.env),
@@ -1600,7 +1606,7 @@ function createConfigStore({ settingsDefaults } = {}) {
1600
1606
  if (newConfig.telegram != null) config.telegram = newConfig.telegram;
1601
1607
  if (newConfig.ingest != null) config.ingest = newConfig.ingest;
1602
1608
  if (newConfig.agentApi != null) config.agentApi = newConfig.agentApi;
1603
- if (newConfig.sandbox != null) config.sandbox = newConfig.sandbox;
1609
+ if (newConfig.guardrails != null) config.guardrails = newConfig.guardrails;
1604
1610
  if (newConfig.telemetry != null) config.telemetry = newConfig.telemetry;
1605
1611
  if (newConfig.workflows == null) delete config.workflows;
1606
1612
  if (newConfig.workflows != null) config.workflows = newConfig.workflows;
@@ -1,27 +1,7 @@
1
- import { _ as SessionDoc, d as PendingPromptDetail, g as SESSION_DOC_PATH_MAX_CHARS, p as PendingWakeup, v as SessionSnapshot, x as TaskTitle, y as SessionState } from "./session-Dtkp9o3r.js";
2
- import { D as MyPrMergeWhenReadyRequest, Dt as CoherenceRisk, Et as CoherenceReadiness, F as CommitSha, O as MyPrMergeWhenReadyResult, P as MyPrsStatus, Q as TeamReviewActionResult, S as MyPrKeepMergeableResult, T as MyPrMergeResult, Tt as CoherenceOrient, Z as TeamReviewActionRequest, _t as ReviewsRefreshResult, gt as ReviewsRefreshRequest, jt as CoherenceWorkState, mt as REPO_SLUG_RE, n as BUILTIN_AGENT_IDS, nt as TeamReviewStatus, vt as reviewsPollingShape, w as MyPrMergeRequest, x as MyPrKeepMergeableRequest } from "./config-B6BkTOcE.js";
1
+ import { T as TaskTitle, b as SessionSnapshot, d as PendingPromptDetail, g as SESSION_DOC_PATH_MAX_CHARS, p as PendingWakeup, x as SessionState, y as SessionDoc } from "./session-C7rstCmA.js";
2
+ import { D as MyPrMergeWhenReadyRequest, Dt as CoherenceRisk, Et as CoherenceReadiness, F as CommitSha, O as MyPrMergeWhenReadyResult, P as MyPrsStatus, Q as TeamReviewActionResult, S as MyPrKeepMergeableResult, T as MyPrMergeResult, Tt as CoherenceOrient, Z as TeamReviewActionRequest, _t as ReviewsRefreshResult, gt as ReviewsRefreshRequest, jt as CoherenceWorkState, mt as REPO_SLUG_RE, n as BUILTIN_AGENT_IDS, nt as TeamReviewStatus, vt as reviewsPollingShape, w as MyPrMergeRequest, x as MyPrKeepMergeableRequest } from "./config-DTwMFUjx.js";
3
3
  import { z } from "zod";
4
4
  //#region shared/contracts/factory.ts
5
- var FactoryIssue = z.object({
6
- issueId: z.string().min(1),
7
- firstSeenMs: z.number().finite(),
8
- framePaths: z.array(z.string())
9
- });
10
- var FactoryWatchEntry = z.object({
11
- workId: z.string().min(1),
12
- intentId: z.string().min(1),
13
- projectId: z.string().min(1),
14
- mergedSha: z.string().regex(/^[a-f0-9]{40,64}$/),
15
- mergedAt: z.iso.datetime(),
16
- writeScopes: z.array(z.string()),
17
- breaches: z.array(FactoryIssue).optional()
18
- });
19
- var FactoryHogQLResponse = z.looseObject({ results: z.array(z.unknown()) });
20
- var FactoryIssueQueryRow = z.object({
21
- issueId: z.string().min(1),
22
- firstSeen: z.string().min(1),
23
- framePaths: z.array(z.string())
24
- });
25
5
  var FactoryConsequences = z.looseObject({ records: z.array(z.looseObject({
26
6
  from: z.object({
27
7
  kind: z.string(),
@@ -50,7 +30,6 @@ var FactoryProjectState = z.object({
50
30
  sessionId: z.string()
51
31
  })).optional(),
52
32
  reviewing: z.array(z.string()).optional(),
53
- watches: z.array(FactoryWatchEntry).optional(),
54
33
  note: z.string().nullable().optional(),
55
34
  spentTodayUsd: z.number().finite().nonnegative().optional(),
56
35
  dailyBudgetUsd: z.number().finite().nonnegative().nullable().optional(),
@@ -189,7 +168,6 @@ var FactoryLaneState = z.object({
189
168
  ledgerPath: z.string().min(1).max(4096).nullable(),
190
169
  ledgerBranch: z.string().min(1).max(1024).nullable(),
191
170
  paused: z.boolean(),
192
- watch: z.array(FactoryWatchEntry).optional(),
193
171
  trustedVerifications: z.array(z.object({
194
172
  id: z.string().min(1),
195
173
  sha: z.string().regex(/^[a-f0-9]{40,64}$/)
@@ -210,7 +188,6 @@ var FactoryLaneState = z.object({
210
188
  tickets: z.array(FactoryIntentTicket).min(1).max(FACTORY_INTENT_TICKET_LIMIT)
211
189
  })).optional(),
212
190
  intentBaseShas: z.record(z.string().min(1), z.string().regex(/^[a-f0-9]{40,64}$/)).optional(),
213
- filedBreaches: z.array(z.string().min(1)).optional(),
214
191
  factoryLandedShas: z.array(z.string().regex(/^[a-f0-9]{40,64}$/)).optional(),
215
192
  unlandedFactoryRecords: z.array(FactoryUnlandedRecord).optional(),
216
193
  ticketBlockCounts: z.record(z.string().min(1), z.number().int().nonnegative()).optional(),
@@ -236,7 +213,6 @@ var FactoryDecisionKind = z.enum([
236
213
  "admission",
237
214
  "closeout",
238
215
  "merge",
239
- "watch",
240
216
  "verification",
241
217
  "exception",
242
218
  "landing",
@@ -251,9 +227,6 @@ var FactoryDecisionOutcome = z.enum([
251
227
  "block",
252
228
  "merge",
253
229
  "merged",
254
- "breach",
255
- "verified",
256
- "verified-unwatched",
257
230
  "failed",
258
231
  "stale",
259
232
  "passed",
@@ -269,7 +242,6 @@ var FactoryDecisionFailureClass = z.enum([
269
242
  "check",
270
243
  "review",
271
244
  "closeout",
272
- "breach",
273
245
  "verification",
274
246
  "stale",
275
247
  "exception",
@@ -331,15 +303,6 @@ var FactoryDecisionLogLine = z.discriminatedUnion("kind", [
331
303
  outcome: z.literal("merged"),
332
304
  mergedSha: z.string().regex(/^[a-f0-9]{40,64}$/)
333
305
  }),
334
- z.strictObject({
335
- ...decisionFields,
336
- kind: z.literal("watch"),
337
- outcome: z.enum([
338
- "breach",
339
- "verified",
340
- "verified-unwatched"
341
- ])
342
- }),
343
306
  z.strictObject({
344
307
  ...decisionFields,
345
308
  kind: z.literal("verification"),
@@ -369,7 +332,6 @@ var FactoryDecisionLogLine = z.discriminatedUnion("kind", [
369
332
  "refused",
370
333
  "retry",
371
334
  "block",
372
- "breach",
373
335
  "failed",
374
336
  "stale",
375
337
  "raised",
@@ -2168,4 +2130,4 @@ z.object({
2168
2130
  projects: z.array(z.string()).optional()
2169
2131
  }).passthrough();
2170
2132
  //#endregion
2171
- export { FactoryHarnessVerdict as $, BenchmarkActionRequest as A, PrCheckoutCaseInput as B, IssueKey as C, IssuesStatus as D, IssuesState as E, BenchmarkStatus as F, TelemetryState as G, PendingCrashReport as H, BenchmarkSuite as I, FACTORY_ERROR_MAX_CHARS as J, FACTORY_DECISION_OUTPUT_MAX_BYTES as K, CommitComparison as L, BenchmarkId as M, BenchmarkJudgement as N, ChangeMap as O, BenchmarkRun as P, FactoryHarnessStateLine as Q, MergedPrListing as R, GithubIssueResponse as S, IssuesSearchResponse as T, TELEMETRY_EVENT_SCHEMAS as U, FeatureFlagsResponse as V, TELEMETRY_KILL_SWITCH_FLAG as W, FactoryConsequences as X, FACTORY_PROTECTED_PATH_FLOOR as Y, FactoryControlRequest as Z, PlanDecision as _, ClientMessage as a, FactoryQueueIntentRequest as at, planTitle as b, UpdateJournal as c, FactoryWorkerEvent as ct, TraceRecord as d, FactoryHogQLResponse as et, PLAN_BODY_CAP_BYTES as f, PLAN_TOOL_NAME as g, PLAN_RESULT_HOOK_EVENT as h, CONTROL_FRAME_MAX_BYTES as i, FactoryProjectState as it, BenchmarkCase as j, changeMapFactId as k, MAX_RAW_LINE_CHARS as l, isSingleFactoryPathSegment as lt, PLAN_HOOK_OUTPUT_MAX_CHARS as m, HookEnvelope as n, FactoryIssueQueryRow as nt, DIFF_ANNOTATION_NOTE_MAX_CHARS as o, FactoryReviewVerdict as ot, PLAN_HOOK_EVENT as p, FactoryDecisionLogLine as q, parseDataClientMessage as r, FactoryLaneState as rt, InstallFlavor as s, FactoryReviewerOutput as st, HTTP_URL_RE as t, FactoryIssue as tt, TraceCheckpoint as u, PlanRevision as v, IssueUpdate as w, GithubIssuePullRequestsRepository as x, parseExitPlanModeHookPayload as y, MinedPrReviewData as z };
2133
+ export { FactoryHarnessVerdict as $, BenchmarkActionRequest as A, PrCheckoutCaseInput as B, IssueKey as C, IssuesStatus as D, IssuesState as E, BenchmarkStatus as F, TelemetryState as G, PendingCrashReport as H, BenchmarkSuite as I, FACTORY_ERROR_MAX_CHARS as J, FACTORY_DECISION_OUTPUT_MAX_BYTES as K, CommitComparison as L, BenchmarkId as M, BenchmarkJudgement as N, ChangeMap as O, BenchmarkRun as P, FactoryHarnessStateLine as Q, MergedPrListing as R, GithubIssueResponse as S, IssuesSearchResponse as T, TELEMETRY_EVENT_SCHEMAS as U, FeatureFlagsResponse as V, TELEMETRY_KILL_SWITCH_FLAG as W, FactoryConsequences as X, FACTORY_PROTECTED_PATH_FLOOR as Y, FactoryControlRequest as Z, PlanDecision as _, ClientMessage as a, FactoryWorkerEvent as at, planTitle as b, UpdateJournal as c, TraceRecord as d, FactoryLaneState as et, PLAN_BODY_CAP_BYTES as f, PLAN_TOOL_NAME as g, PLAN_RESULT_HOOK_EVENT as h, CONTROL_FRAME_MAX_BYTES as i, FactoryReviewerOutput as it, BenchmarkCase as j, changeMapFactId as k, MAX_RAW_LINE_CHARS as l, PLAN_HOOK_OUTPUT_MAX_CHARS as m, HookEnvelope as n, FactoryQueueIntentRequest as nt, DIFF_ANNOTATION_NOTE_MAX_CHARS as o, isSingleFactoryPathSegment as ot, PLAN_HOOK_EVENT as p, FactoryDecisionLogLine as q, parseDataClientMessage as r, FactoryReviewVerdict as rt, InstallFlavor as s, HTTP_URL_RE as t, FactoryProjectState as tt, TraceCheckpoint as u, PlanRevision as v, IssueUpdate as w, GithubIssuePullRequestsRepository as x, parseExitPlanModeHookPayload as y, MinedPrReviewData as z };
@@ -1,6 +1,6 @@
1
1
  import { r as errorMessage } from "./text-DoirglWV.js";
2
2
  import { o as relayPath } from "./runtime-paths-BPoxENmK.js";
3
- import { n as AGENT_URL_ENV } from "./session-Dtkp9o3r.js";
3
+ import { _ as SIGN_URL_ENV, n as AGENT_URL_ENV } from "./session-C7rstCmA.js";
4
4
  import { t as HOOK_URL_ENV } from "./hook-relay-core-DA_bz2KA.js";
5
5
  import { n as isRecord } from "./coerce-NSst8oRP.js";
6
6
  import { a as SANE_YOLO_PATH_ENV, n as RTK_PATH_ENV, o as saneYoloEnv } from "./rtk-hook-core-BmEz2aq9.js";
@@ -19,6 +19,7 @@ var GLIMMERVOID_SCRUB_KEYS = [
19
19
  "GLIMMERVOID_CONFIG",
20
20
  HOOK_URL_ENV,
21
21
  AGENT_URL_ENV,
22
+ SIGN_URL_ENV,
22
23
  RTK_PATH_ENV,
23
24
  SANE_YOLO_PATH_ENV,
24
25
  ...GLIMMERVOID_SECRET_KEYS
@@ -2,7 +2,7 @@ import { r as errorMessage } from "./text-DoirglWV.js";
2
2
  import { s as resolvePackageBin } from "./runtime-paths-BPoxENmK.js";
3
3
  import { r as execFileSync } from "./child-process-safe-DDELk9XC.js";
4
4
  import { n as glimmervoidHomeDir, t as decideConfigPath } from "./config-path-core-DFt-TemS.js";
5
- import { r as BrowserConfig } from "./config-B6BkTOcE.js";
5
+ import { r as BrowserConfig } from "./config-DTwMFUjx.js";
6
6
  import fs, { closeSync, constants, existsSync, fstatSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, realpathSync } from "node:fs";
7
7
  import path, { dirname, join, posix, resolve, win32 } from "node:path";
8
8
  import { parseArgs } from "node:util";