glimmervoid 0.35.1 → 0.37.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 (50) hide show
  1. package/README.md +86 -82
  2. package/dist/bin/glimmervoid.js +58 -114
  3. package/dist/chunks/{adapters-CADejSpq.js → adapters-BmfVPxlH.js} +29 -61
  4. package/dist/chunks/adapters-CqFFmM2R.js +1 -0
  5. package/dist/chunks/{agent-api-cli-CRj_FYbz.js → agent-api-cli-BTHEyJKS.js} +1 -1
  6. package/dist/chunks/{agent-api-cli-vGwstJ1j.js → agent-api-cli-CBgOKXoO.js} +41 -12
  7. package/dist/chunks/{agent-api-core-D1233u1U.js → agent-api-core-DzKhakCv.js} +94 -3
  8. package/dist/chunks/{agent-setup-cli-BTAFcckd.js → agent-setup-cli-C8DGxlA-.js} +1 -1
  9. package/dist/chunks/{config-rPbbL4nW.js → config-BYc2z1Oc.js} +60 -779
  10. package/dist/chunks/config-store-B7MpiYxG.js +4181 -0
  11. package/dist/chunks/config-store-CsUoy88Q.js +1 -0
  12. package/dist/chunks/{contracts-DjIgIuDk.js → contracts-C6ipN_zw.js} +100 -12
  13. package/dist/chunks/git-version-6QFnKbWa.js +139 -0
  14. package/dist/chunks/{grok-KKgdSe-7.js → grok-CZ6kP_vD.js} +7 -3
  15. package/dist/chunks/guardrails-deps-Cb-ki4EU.js +70 -0
  16. package/dist/chunks/{sandbox-proxy-core-hnQgKR0T.js → guardrails-proxy-core-BI3rdY-m.js} +4 -4
  17. package/dist/chunks/{hook-command-core-DclEoE9e.js → hook-command-core-qTNK-xMF.js} +4 -1
  18. package/dist/chunks/{hook-tools-UX2fmt81.js → hook-tools-BkxllUHE.js} +9 -16
  19. package/dist/chunks/{knowledge-graph-cli-Rj5nj87L.js → knowledge-graph-cli-DApeMzA8.js} +1 -1
  20. package/dist/chunks/{loopback-post-DepQfdcM.js → loopback-post-DJ6iYWuL.js} +9 -9
  21. package/dist/chunks/{main-C-T2Uk20.js → main-BUfjroXE.js} +16282 -12595
  22. package/dist/chunks/{pair-cli-Dcyzv3In.js → pair-cli-GZ9t1mIO.js} +2 -2
  23. package/dist/chunks/{remote-config-Dd1T-VJA.js → remote-config-D2Is89Kj.js} +1 -1
  24. package/dist/chunks/{rtk-hook-core-BmEz2aq9.js → rtk-hook-core-VrUafGAp.js} +15 -5
  25. package/dist/chunks/rtk-resolver-B8BPgN9L.js +1 -0
  26. package/dist/chunks/{rtk-resolver-B9pzjLsM.js → rtk-resolver-C_micGrL.js} +1 -1
  27. package/dist/chunks/session-BZbariv5.js +1032 -0
  28. package/dist/chunks/{session-routes-BYy3am9m.js → session-routes-C4t8O8yg.js} +9 -9
  29. package/dist/chunks/settings-cli-DQOjmjev.js +484 -0
  30. package/dist/chunks/{ssh-sign-cli-DPHpT22B.js → ssh-sign-cli-LIBP8ppO.js} +2 -2
  31. package/dist/client/assets/index-B_Qt7fbZ.css +1 -0
  32. package/dist/client/assets/index-D-upBor0.js +265 -0
  33. package/dist/client/index.html +5 -3
  34. package/dist/scripts/postinstall-path-check.js +4 -4
  35. package/dist/server/index.js +1 -1
  36. package/dist/session/command-hook-relay.js +1 -1
  37. package/dist/session/{sandbox-open-launcher.js → guardrails-open-launcher.js} +10 -10
  38. package/dist/session/hook-relay.js +1 -1
  39. package/dist/session/hook-tool-relay.js +3 -3
  40. package/dist/session/statusline-relay.js +1 -1
  41. package/package.json +6 -5
  42. package/dist/chunks/adapters-B37wqNti.js +0 -1
  43. package/dist/chunks/config-store-BeIxAZNn.js +0 -1
  44. package/dist/chunks/config-store-BtsYbNC3.js +0 -1713
  45. package/dist/chunks/git-version-CUcDtF5k.js +0 -58
  46. package/dist/chunks/rtk-resolver-SWU5VVM7.js +0 -1
  47. package/dist/chunks/sandbox-deps-CWiH1d1w.js +0 -70
  48. package/dist/chunks/session-D6xXN0UU.js +0 -232
  49. package/dist/client/assets/index-CUxRHbCS.js +0 -254
  50. package/dist/client/assets/index-DE2GUmqs.css +0 -1
@@ -7,8 +7,8 @@
7
7
  <link rel="icon" type="image/svg+xml" href="/assets/favicon-CKygeLwW.svg">
8
8
  <title>Glimmervoid</title>
9
9
  <style>html,body{background:var(--bg,#0a0810);height:100%;color:var(--text,#c8c0e0);font-family:var(--font-mono,"CommitMono", "Cascadia Code", "Fira Code", "Consolas", "Menlo", monospace);margin:0;padding:0}.app-shell{display:none}html:not([data-layout=phone]) .app-ready .app-shell{display:contents}.loading-screen{z-index:9999;background:#0a0810;flex-direction:column;justify-content:center;align-items:center;gap:20px;transition:opacity .3s;display:flex;position:fixed;inset:0}.loading-screen.fade-out{opacity:0;pointer-events:none}.loading-title{letter-spacing:.1em;color:#e8e0ff;text-transform:uppercase;font-family:CommitMono,Cascadia Code,Fira Code,Consolas,Menlo,monospace;font-size:20px;font-weight:700}.loading-title:before{content:"▸";color:#c084fc}.loading-status{color:#8276b0;letter-spacing:.04em;font-family:CommitMono,Cascadia Code,Fira Code,Consolas,Menlo,monospace;font-size:12px}.loading-spinner{border:2px solid #2a2440;border-top-color:#c084fc;border-radius:50%;width:28px;height:28px;animation:.8s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.shutdown-screen{z-index:9999;-webkit-backdrop-filter:blur();backdrop-filter:blur();pointer-events:none;opacity:0;background:#0a081000;flex-direction:column;justify-content:center;align-items:center;gap:20px;transition:background .4s,-webkit-backdrop-filter .4s,backdrop-filter .4s,opacity .3s;display:flex;position:fixed;inset:0}.shutdown-screen.active{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);pointer-events:auto;opacity:1;background:#0a0810eb}.shutdown-status{color:#8276b0;letter-spacing:.04em;font-family:CommitMono,Cascadia Code,Fira Code,Consolas,Menlo,monospace;font-size:12px;transition:color .3s}.shutdown-screen.done .loading-spinner{opacity:.3;border-color:#2a2440;animation:none}.shutdown-screen.done .shutdown-status{color:#4a4268}</style>
10
- <script type="module" crossorigin src="/assets/index-CUxRHbCS.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-DE2GUmqs.css">
10
+ <script type="module" crossorigin src="/assets/index-D-upBor0.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-B_Qt7fbZ.css">
12
12
  </head>
13
13
  <body>
14
14
  <div class="loading-screen" id="loading-screen">
@@ -39,8 +39,8 @@
39
39
  <div class="header-tabs" id="header-tabs" role="tablist" aria-label="Primary views">
40
40
  </div>
41
41
  </div>
42
+ <span class="header-aggregate" id="aggregate-status" role="status" aria-live="polite"></span>
42
43
  <div class="header-right">
43
- <span class="header-aggregate" id="aggregate-status" role="status" aria-live="polite"></span>
44
44
  <div class="celebration-tray" id="celebration-tray" data-state="empty">
45
45
  <button class="btn-celebrations" id="btn-celebrations" type="button" title="Play queued merge celebrations" aria-label="Play queued merge celebrations"><svg class="btn-celebrations-icon" viewBox="0 0 16 16" width="15" height="15" aria-hidden="true" focusable="false"><path d="M4.5 2h7v3.5a3.5 3.5 0 0 1-7 0z" /><path d="M4.5 3.5H2.5a2 2 0 0 0 2 2.5" /><path d="M11.5 3.5h2a2 2 0 0 1-2 2.5" /><path d="M8 9v3" /><path d="M5.5 14h5" /></svg></button>
46
46
  <span class="celebration-tray-count" id="celebration-tray-count" aria-live="polite"></span>
@@ -48,6 +48,8 @@
48
48
  <button class="btn-add-header" id="btn-add-session-header" type="button" title="Add a new session">+ Session</button>
49
49
  <button class="btn-help" id="btn-help" type="button" title="Keyboard shortcuts" aria-label="Keyboard shortcuts and version">?</button>
50
50
  <button class="btn-mute" id="btn-mute" type="button" title="Mute alerts" aria-label="Mute alerts" aria-pressed="false">&#9834;</button>
51
+ <span class="streamer-badge" id="streamer-badge" role="status">STREAMER</span>
52
+ <button class="btn-streamer" id="btn-streamer" type="button" title="Streamer mode" aria-label="Streamer mode" aria-pressed="false"><svg class="btn-streamer-icon" viewBox="0 0 16 16" width="15" height="15" aria-hidden="true" focusable="false"><rect x="1.5" y="3" width="13" height="8.5" rx="1" /><path d="M5.5 14h5" /><path d="M8 11.5V14" /></svg></button>
51
53
  <div class="header-menu" id="power-menu">
52
54
  <button class="btn-menu btn-power" id="btn-power" type="button" title="Server power" aria-label="Server power" aria-haspopup="menu" aria-expanded="false" aria-controls="power-menu-dropdown"><svg class="btn-power-icon" viewBox="0 0 16 16" width="15" height="15" aria-hidden="true" focusable="false"><path d="M8 1.5v6" /><path d="M4.4 3.6a5.5 5.5 0 1 0 7.2 0" /></svg></button>
53
55
  <div class="header-menu-dropdown" id="power-menu-dropdown" role="menu">
@@ -1,4 +1,4 @@
1
- import { a as sandboxInstallNotice, r as probeSandboxDependencies } from "../chunks/sandbox-deps-CWiH1d1w.js";
1
+ import { a as guardrailsInstallNotice, r as probeGuardrailsDependencies } from "../chunks/guardrails-deps-Cb-ki4EU.js";
2
2
  import { n as npmGlobalBinDir, r as onPath, t as formatPathNotice } from "../chunks/path-doctor-C23VAqeu.js";
3
3
  import os from "node:os";
4
4
  //#region scripts/postinstall-path-check.ts
@@ -22,15 +22,15 @@ function printPathNotice() {
22
22
  platform
23
23
  })}\n\n`);
24
24
  }
25
- function printSandboxNotice() {
26
- const notice = sandboxInstallNotice(probeSandboxDependencies());
25
+ function printGuardrailsNotice() {
26
+ const notice = guardrailsInstallNotice(probeGuardrailsDependencies());
27
27
  if (notice !== null) process.stdout.write(`${notice}\n`);
28
28
  }
29
29
  try {
30
30
  printPathNotice();
31
31
  } catch {}
32
32
  try {
33
- printSandboxNotice();
33
+ printGuardrailsNotice();
34
34
  } catch {}
35
35
  //#endregion
36
36
  export {};
@@ -87,6 +87,6 @@ if (!nodePty.ok) {
87
87
  }));
88
88
  process.exit(1);
89
89
  }
90
- await import("../chunks/main-C-T2Uk20.js");
90
+ await import("../chunks/main-BUfjroXE.js");
91
91
  //#endregion
92
92
  export {};
@@ -1,5 +1,5 @@
1
1
  import { t as readStdin } from "../chunks/relay-stdin-CpHvLu6M.js";
2
- import { t as postPayload } from "../chunks/loopback-post-DepQfdcM.js";
2
+ import { t as postPayload } from "../chunks/loopback-post-DJ6iYWuL.js";
3
3
  import { n as sessionStartContextOutput } from "../chunks/refocus-core-BKQKllq7.js";
4
4
  //#region session/command-hook-relay.ts
5
5
  async function main(argv = process.argv.slice(2), stdin = process.stdin, stdout = process.stdout) {
@@ -4,14 +4,14 @@ import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import tty from "node:tty";
6
6
  import { FilesystemConfigSchema, SandboxManager } from "@anthropic-ai/sandbox-runtime";
7
- //#region session/core/sandbox-terminal-core.ts
7
+ //#region session/core/guardrails-terminal-core.ts
8
8
  var RUNTIME_TERMINAL_FILTER = "(regex #\"^/dev/ttys\")";
9
9
  var RUNTIME_TERMINAL_FILTER_COUNT = 2;
10
10
  var TERMINAL_PATH_SHAPE = /^\/dev\/ttys\d+$/;
11
11
  function confineToOwnTerminal(argv, ownTerminalPath) {
12
12
  if (!TERMINAL_PATH_SHAPE.test(ownTerminalPath)) return {
13
13
  ok: false,
14
- reason: `${ownTerminalPath} is not a pseudo-terminal the sandbox can be confined to`
14
+ reason: `${ownTerminalPath} is not a pseudo-terminal the guardrails can be confined to`
15
15
  };
16
16
  const filterCount = argv.reduce((count, word) => count + word.split(RUNTIME_TERMINAL_FILTER).length - 1, 0);
17
17
  if (filterCount !== RUNTIME_TERMINAL_FILTER_COUNT) return {
@@ -25,7 +25,7 @@ function confineToOwnTerminal(argv, ownTerminalPath) {
25
25
  };
26
26
  }
27
27
  //#endregion
28
- //#region session/sandbox-open-launcher.ts
28
+ //#region session/guardrails-open-launcher.ts
29
29
  var FORWARDED_SIGNALS = [
30
30
  "SIGINT",
31
31
  "SIGTERM",
@@ -72,7 +72,7 @@ function ownTerminalPath() {
72
72
  if (ownName === void 0) throw new Error("the launcher terminal is not a pseudo-terminal under /dev");
73
73
  return path.join(DEVICE_FOLDER, ownName);
74
74
  }
75
- function sandboxArgv(argv, { runtimeConfig, isAnyTerminalAllowed }) {
75
+ function guardrailsArgv(argv, { runtimeConfig, isAnyTerminalAllowed }) {
76
76
  if (runtimeConfig.allowPty !== true || isAnyTerminalAllowed || process.platform !== "darwin") return argv;
77
77
  const confinement = confineToOwnTerminal(argv, ownTerminalPath());
78
78
  if (!confinement.ok) throw new Error(confinement.reason);
@@ -82,9 +82,9 @@ function exitCodeFor(code, signal) {
82
82
  if (signal === null) return code ?? 0;
83
83
  return FORWARDED_SIGNALS.some((forwarded) => forwarded === signal) ? 0 : 1;
84
84
  }
85
- async function launchInOpenNetworkSandbox() {
85
+ async function launchInOpenNetworkGuardrails() {
86
86
  const [policyPath, ...command] = process.argv.slice(2);
87
- if (!policyPath || command.length === 0) throw new Error("usage: sandbox-open-launcher <policy file> <command> [arguments]");
87
+ if (!policyPath || command.length === 0) throw new Error("usage: guardrails-open-launcher <policy file> <command> [arguments]");
88
88
  const openPolicy = readOpenPolicy(policyPath);
89
89
  const dependencies = SandboxManager.checkDependencies();
90
90
  const dependencyProblems = [...dependencies.errors, ...dependencies.warnings];
@@ -109,7 +109,7 @@ async function launchInOpenNetworkSandbox() {
109
109
  exitWhenInterrupted();
110
110
  throw wrapFailure;
111
111
  });
112
- const [shell, ...shellArgs] = sandboxArgv(wrapped.argv, openPolicy);
112
+ const [shell, ...shellArgs] = guardrailsArgv(wrapped.argv, openPolicy);
113
113
  if (!shell || shellArgs.at(-1) === commandLine) throw new Error("the sandbox runtime returned the command unwrapped");
114
114
  exitWhenInterrupted();
115
115
  child = spawn(shell, shellArgs, {
@@ -117,7 +117,7 @@ async function launchInOpenNetworkSandbox() {
117
117
  env: wrapped.env
118
118
  });
119
119
  child.on("error", (error) => {
120
- console.error(`sandbox launcher: ${error.message}`);
120
+ console.error(`guardrails launcher: ${error.message}`);
121
121
  process.exit(1);
122
122
  });
123
123
  child.on("exit", (code, signal) => {
@@ -125,8 +125,8 @@ async function launchInOpenNetworkSandbox() {
125
125
  process.exit(exitCodeFor(code, signal));
126
126
  });
127
127
  }
128
- launchInOpenNetworkSandbox().catch((error) => {
129
- console.error(`sandbox launcher: ${errorMessage(error)}`);
128
+ launchInOpenNetworkGuardrails().catch((error) => {
129
+ console.error(`guardrails launcher: ${errorMessage(error)}`);
130
130
  process.exit(1);
131
131
  });
132
132
  //#endregion
@@ -1,6 +1,6 @@
1
1
  import { t as readStdin } from "../chunks/relay-stdin-CpHvLu6M.js";
2
2
  import { r as decideRelayPost } from "../chunks/hook-relay-core-DA_bz2KA.js";
3
- import { n as postToLoopback } from "../chunks/loopback-post-DepQfdcM.js";
3
+ import { n as postToLoopback } from "../chunks/loopback-post-DJ6iYWuL.js";
4
4
  //#region session/hook-relay.ts
5
5
  async function main(argv = process.argv.slice(2), stdin = process.stdin, env = process.env) {
6
6
  const [event] = argv;
@@ -1,6 +1,6 @@
1
1
  import { o as spawn } from "../chunks/child-process-safe-CbQnyh7D.js";
2
2
  import { t as readStdin } from "../chunks/relay-stdin-CpHvLu6M.js";
3
- import { a as SANE_YOLO_PATH_ENV, n as RTK_PATH_ENV, r as normalizeRtkHookResponse } from "../chunks/rtk-hook-core-BmEz2aq9.js";
3
+ import { i as normalizeRtkHookResponse, o as SANE_YOLO_PATH_ENV, r as RTK_PATH_ENV, t as CLAUDE_RELAY_FLAVOR } from "../chunks/rtk-hook-core-VrUafGAp.js";
4
4
  //#region session/hook-tool-relay.ts
5
5
  var RTK_TIMEOUT_MS = 3e3;
6
6
  function runHookTool(toolId, binPath, body) {
@@ -69,7 +69,7 @@ function runHookTool(toolId, binPath, body) {
69
69
  }
70
70
  });
71
71
  }
72
- async function main(toolId = process.argv[2] ?? "", env = process.env, stdin = process.stdin, stdout = process.stdout, runner = (binPath, body) => runHookTool(toolId === "rtk" ? "rtk" : "saneYolo", binPath, body)) {
72
+ async function main(toolId = process.argv[2] ?? "", env = process.env, stdin = process.stdin, stdout = process.stdout, runner = (binPath, body) => runHookTool(toolId === "rtk" ? "rtk" : "saneYolo", binPath, body), agentFlavor = process.argv[3] ?? "") {
73
73
  if (toolId !== "rtk" && toolId !== "saneYolo") return {
74
74
  code: 0,
75
75
  reason: "unknown-tool"
@@ -86,7 +86,7 @@ async function main(toolId = process.argv[2] ?? "", env = process.env, stdin = p
86
86
  reason: "empty-payload"
87
87
  };
88
88
  const toolOutput = await runner(binPath, body);
89
- const response = toolId === "rtk" ? normalizeRtkHookResponse(toolOutput) : toolOutput;
89
+ const response = toolId === "rtk" ? normalizeRtkHookResponse(toolOutput, { isForClaude: agentFlavor === CLAUDE_RELAY_FLAVOR }) : toolOutput;
90
90
  if (!response) return {
91
91
  code: 0,
92
92
  reason: "no-response"
@@ -1,6 +1,6 @@
1
1
  import { o as spawn } from "../chunks/child-process-safe-CbQnyh7D.js";
2
2
  import { t as readStdin } from "../chunks/relay-stdin-CpHvLu6M.js";
3
- import { t as postPayload } from "../chunks/loopback-post-DepQfdcM.js";
3
+ import { t as postPayload } from "../chunks/loopback-post-DJ6iYWuL.js";
4
4
  import { n as isRecord } from "../chunks/coerce-NSst8oRP.js";
5
5
  import { n as parseJsonRecord } from "../chunks/json-core-dfa_7Fak.js";
6
6
  //#region session/statusline-relay.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glimmervoid",
3
- "version": "0.35.1",
3
+ "version": "0.37.0",
4
4
  "description": "Mission control for coding agents: run and supervise Claude Code, Codex and Grok sessions in parallel git worktrees from one local browser dashboard",
5
5
  "main": "dist/server/index.js",
6
6
  "type": "module",
@@ -30,7 +30,7 @@
30
30
  "type": "git",
31
31
  "url": "git+https://github.com/johncwaters/glimmervoid.git"
32
32
  },
33
- "homepage": "https://github.com/johncwaters/glimmervoid#readme",
33
+ "homepage": "https://glimmervoid.dev",
34
34
  "bugs": {
35
35
  "url": "https://github.com/johncwaters/glimmervoid/issues"
36
36
  },
@@ -55,8 +55,9 @@
55
55
  "scripts": {
56
56
  "start": "node dist/server/index.js",
57
57
  "factory:run": "node test/factory/run.ts",
58
- "lint": "biome check .",
58
+ "lint": "biome check . --max-diagnostics=none",
59
59
  "test": "node --import ./tests/helpers/isolate-home.ts --test \"tests/**/*.test.ts\"",
60
+ "test:files": "node --import ./tests/helpers/isolate-home.ts --test",
60
61
  "typecheck": "tsc --project tsconfig.json && tsc --project tsconfig.public.json && tsc --project tsconfig.browser-harness.json",
61
62
  "test:browser": "node test/browser/harness.ts",
62
63
  "site:capture": "node test/site-capture/capture.ts",
@@ -80,7 +81,7 @@
80
81
  "@xterm/addon-webgl": "^0.19.0",
81
82
  "@xterm/headless": "^6.0.0",
82
83
  "@xterm/xterm": "^6.0.0",
83
- "cc-safety-net": "2.6.10",
84
+ "cc-safety-net": "2.6.12",
84
85
  "express": "^5.3.0",
85
86
  "node-pty": "^1.1.0",
86
87
  "ws": "^8.22.0",
@@ -93,7 +94,7 @@
93
94
  "@biomejs/biome": "^2.5.15",
94
95
  "@tailwindcss/vite": "^4.3.3",
95
96
  "@types/node": "^26.6.5",
96
- "playwright-core": "1.64.0",
97
+ "playwright-core": "1.64.1",
97
98
  "tailwindcss": "^4.3.3",
98
99
  "typescript": "^7.0.2",
99
100
  "vite": "^8.3.4"
@@ -1 +0,0 @@
1
- export { a as describeAgentResolvability, l as listAgentIds, d as setCustomAgents } from "./adapters-CADejSpq.js";
@@ -1 +0,0 @@
1
- export { c as loadConfigFile } from "./config-store-BtsYbNC3.js";