glimmervoid 0.29.1 → 0.30.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 +7 -9
  2. package/dist/bin/glimmervoid.js +28 -12
  3. package/dist/chunks/{adapters-DIavI9-i.js → adapters-Dho1VSY5.js} +1 -1
  4. package/dist/chunks/{adapters-Dlvu1FVB.js → adapters-zPDx1Xox.js} +23 -14
  5. package/dist/chunks/{agent-api-cli-ClOzm28U.js → agent-api-cli-D0MmtEdz.js} +2 -2
  6. package/dist/chunks/{agent-api-core-D6LHrpSL.js → agent-api-core-Dz0r21y9.js} +1 -1
  7. package/dist/chunks/{agent-setup-cli-C1CQ8Nkk.js → agent-setup-cli-B5Atxr3F.js} +5 -3
  8. package/dist/chunks/{child-process-safe-Cz22RwlG.js → child-process-safe-DRGsp0TE.js} +1 -1
  9. package/dist/chunks/child-process-safe-DvQjXsgz.js +2 -0
  10. package/dist/chunks/config-store-CC8T3okC.js +2 -0
  11. package/dist/chunks/{config-store-DtPUFVaO.js → config-store-mm7MgzoL.js} +13 -1
  12. package/dist/chunks/{contracts-JKChPhZ0.js → contracts-DGkKNh9W.js} +25 -3
  13. package/dist/chunks/{grok-COekzawt.js → grok-DuU8xVLZ.js} +54 -25
  14. package/dist/chunks/hook-command-core-DclEoE9e.js +14 -0
  15. package/dist/chunks/hook-tools-pSJia7ks.js +74 -0
  16. package/dist/chunks/{main-BVDjy7vH.js → main-CuIZQPhZ.js} +975 -156
  17. package/dist/chunks/{pair-cli-BQQnhkkc.js → pair-cli-w-gCAF-1.js} +2 -2
  18. package/dist/chunks/{remote-config-BHoDFCpo.js → remote-config-C2ytQwrs.js} +8 -4
  19. package/dist/chunks/rtk-hook-core-Bl6gYHPN.js +133 -0
  20. package/dist/chunks/rtk-resolver-CLo-gZzw.js +21 -0
  21. package/dist/chunks/rtk-resolver-CMQAidlI.js +2 -0
  22. package/dist/chunks/{runtime-paths-CVvq20A4.js → runtime-paths-Ci_ksSkj.js} +26 -2
  23. package/dist/chunks/runtime-paths-JLrZ3wyi.js +2 -0
  24. package/dist/chunks/{sandbox-deps-BwvbDBDl.js → sandbox-deps-Dd5-kZnf.js} +1 -1
  25. package/dist/chunks/{session-CJtOveHl.js → session-Cez8aIWg.js} +3 -1
  26. package/dist/chunks/{visions-cli-DUZnopGY.js → visions-cli-BXQFIBCX.js} +1 -1
  27. package/dist/chunks/{visions-setup-C_kJobsy.js → visions-setup-CvVnOe1r.js} +2 -2
  28. package/dist/client/assets/index-B1MFijjb.css +1 -0
  29. package/dist/client/assets/index-CU1iPPdn.js +249 -0
  30. package/dist/client/index.html +2 -2
  31. package/dist/scripts/postinstall-path-check.js +1 -1
  32. package/dist/server/index.js +2 -2
  33. package/dist/session/{rtk-relay.js → hook-tool-relay.js} +32 -15
  34. package/dist/session/statusline-relay.js +1 -1
  35. package/package.json +2 -1
  36. package/dist/chunks/config-store-DtUGwi4-.js +0 -2
  37. package/dist/chunks/rtk-hook-core-DRYrKwYP.js +0 -26
  38. package/dist/chunks/rtk-resolver-DDVVNRBT.js +0 -2
  39. package/dist/chunks/rtk-resolver-oGmO-ew7.js +0 -58
  40. package/dist/client/assets/index-BTwYgSAH.js +0 -248
  41. package/dist/client/assets/index-DgA708PE.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);margin:0;padding:0;font-family:Segoe UI,system-ui,sans-serif}.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: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: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: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-BTwYgSAH.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-DgA708PE.css">
10
+ <script type="module" crossorigin src="/assets/index-CU1iPPdn.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-B1MFijjb.css">
12
12
  </head>
13
13
  <body>
14
14
  <div class="loading-screen" id="loading-screen">
@@ -1,4 +1,4 @@
1
- import { a as sandboxInstallNotice, r as probeSandboxDependencies } from "../chunks/sandbox-deps-BwvbDBDl.js";
1
+ import { a as sandboxInstallNotice, r as probeSandboxDependencies } from "../chunks/sandbox-deps-Dd5-kZnf.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
@@ -1,5 +1,5 @@
1
1
  import { a as formatNodePtyBootRefusal, t as probeNodePty } from "../chunks/node-pty-preflight-CK1knGIR.js";
2
- import { a as packageRoot } from "../chunks/runtime-paths-CVvq20A4.js";
2
+ import { a as packageRoot } from "../chunks/runtime-paths-Ci_ksSkj.js";
3
3
  import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import { pathToFileURL } from "node:url";
@@ -87,6 +87,6 @@ if (!nodePty.ok) {
87
87
  }));
88
88
  process.exit(1);
89
89
  }
90
- await import("../chunks/main-BVDjy7vH.js");
90
+ await import("../chunks/main-CuIZQPhZ.js");
91
91
  //#endregion
92
92
  export {};
@@ -1,9 +1,9 @@
1
- import { a as spawn } from "../chunks/child-process-safe-Cz22RwlG.js";
1
+ import { o as spawn } from "../chunks/child-process-safe-DRGsp0TE.js";
2
2
  import { t as readStdin } from "../chunks/relay-stdin-CpHvLu6M.js";
3
- import { n as RTK_PATH_ENV, r as normalizeRtkHookResponse } from "../chunks/rtk-hook-core-DRYrKwYP.js";
4
- //#region session/rtk-relay.ts
3
+ import { a as SANE_YOLO_PATH_ENV, n as RTK_PATH_ENV, r as normalizeRtkHookResponse } from "../chunks/rtk-hook-core-Bl6gYHPN.js";
4
+ //#region session/hook-tool-relay.ts
5
5
  var RTK_TIMEOUT_MS = 3e3;
6
- function runRtk(rtkPath, body) {
6
+ function runHookTool(toolId, binPath, body) {
7
7
  return new Promise((resolve) => {
8
8
  let settled = false;
9
9
  let timer = null;
@@ -15,7 +15,12 @@ function runRtk(rtkPath, body) {
15
15
  };
16
16
  let child;
17
17
  try {
18
- child = spawn(rtkPath, ["hook", "claude"], { stdio: [
18
+ const command = toolId === "rtk" ? binPath : process.execPath;
19
+ child = spawn(command, toolId === "rtk" ? ["hook", "claude"] : [
20
+ binPath,
21
+ "hook",
22
+ "--grok-build"
23
+ ], { stdio: [
19
24
  "pipe",
20
25
  "pipe",
21
26
  "ignore"
@@ -64,27 +69,39 @@ function runRtk(rtkPath, body) {
64
69
  }
65
70
  });
66
71
  }
67
- async function main(env = process.env, stdin = process.stdin, stdout = process.stdout, runner = runRtk) {
68
- const configuredRtkPath = env[RTK_PATH_ENV];
69
- const rtkPath = typeof configuredRtkPath === "string" ? configuredRtkPath.trim() : "";
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)) {
73
+ if (toolId !== "rtk" && toolId !== "saneYolo") return {
74
+ code: 0,
75
+ reason: "unknown-tool"
76
+ };
77
+ const configuredPath = env[toolId === "rtk" ? RTK_PATH_ENV : SANE_YOLO_PATH_ENV];
78
+ const binPath = typeof configuredPath === "string" ? configuredPath.trim() : "";
79
+ if (!binPath) return {
80
+ code: 0,
81
+ reason: "no-tool-path"
82
+ };
70
83
  const body = await readStdin(stdin);
71
- if (!rtkPath || body.length === 0) return {
84
+ if (body.length === 0) return {
72
85
  code: 0,
73
- reason: rtkPath ? "empty-payload" : "no-rtk-path"
86
+ reason: "empty-payload"
74
87
  };
75
- const response = normalizeRtkHookResponse(await runner(rtkPath, body));
88
+ const toolOutput = await runner(binPath, body);
89
+ const response = toolId === "rtk" ? normalizeRtkHookResponse(toolOutput) : toolOutput;
76
90
  if (!response) return {
77
91
  code: 0,
78
- reason: "no-rewrite"
92
+ reason: "no-response"
79
93
  };
80
94
  try {
81
- stdout.write(`${response}\n`);
95
+ stdout.write(toolId === "rtk" ? `${response}\n` : response);
82
96
  } catch {}
83
97
  return {
84
98
  code: 0,
85
- reason: "rewritten"
99
+ reason: "forwarded"
86
100
  };
87
101
  }
88
102
  if (process.argv[1] === import.meta.filename) main().then((result) => process.exit(result.code)).catch(() => process.exit(0));
103
+ function runRtk(binPath, body) {
104
+ return runHookTool("rtk", binPath, body);
105
+ }
89
106
  //#endregion
90
- export { RTK_TIMEOUT_MS, main, runRtk };
107
+ export { RTK_TIMEOUT_MS, main, runHookTool, runRtk };
@@ -1,4 +1,4 @@
1
- import { a as spawn } from "../chunks/child-process-safe-Cz22RwlG.js";
1
+ import { o as spawn } from "../chunks/child-process-safe-DRGsp0TE.js";
2
2
  import { t as readStdin } from "../chunks/relay-stdin-CpHvLu6M.js";
3
3
  import { t as postPayload } from "../chunks/loopback-post-C7C22eYi.js";
4
4
  //#region session/statusline-relay.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glimmervoid",
3
- "version": "0.29.1",
3
+ "version": "0.30.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",
@@ -77,6 +77,7 @@
77
77
  "@xterm/addon-webgl": "^0.19.0",
78
78
  "@xterm/headless": "^6.0.0",
79
79
  "@xterm/xterm": "^6.0.0",
80
+ "cc-safety-net": "2.6.0",
80
81
  "express": "^5.2.1",
81
82
  "node-pty": "^1.1.0",
82
83
  "ws": "^8.22.0",
@@ -1,2 +0,0 @@
1
- import { c as loadConfigFile } from "./config-store-DtPUFVaO.js";
2
- export { loadConfigFile };
@@ -1,26 +0,0 @@
1
- //#region session/core/rtk-hook-core.ts
2
- var RTK_PATH_ENV = "GLIMMERVOID_RTK_PATH";
3
- var MAX_RTK_STDOUT_BYTES = 65536;
4
- function isPlainObject(value) {
5
- return Boolean(value) && typeof value === "object" && !Array.isArray(value);
6
- }
7
- function normalizeRtkHookResponse(stdoutText) {
8
- if (typeof stdoutText !== "string") return "";
9
- const trimmed = stdoutText.trim();
10
- if (!trimmed) return "";
11
- if (Buffer.byteLength(trimmed) > 65536) return "";
12
- let parsed = null;
13
- try {
14
- parsed = JSON.parse(trimmed);
15
- } catch {
16
- return "";
17
- }
18
- if (!isPlainObject(parsed)) return "";
19
- const hookSpecificOutput = parsed.hookSpecificOutput;
20
- if (isPlainObject(hookSpecificOutput) && isPlainObject(hookSpecificOutput.updatedInput)) {
21
- if (typeof hookSpecificOutput.permissionDecision !== "string") hookSpecificOutput.permissionDecision = "allow";
22
- }
23
- return JSON.stringify(parsed);
24
- }
25
- //#endregion
26
- export { RTK_PATH_ENV as n, normalizeRtkHookResponse as r, MAX_RTK_STDOUT_BYTES as t };
@@ -1,2 +0,0 @@
1
- import { t as getRtkPath } from "./rtk-resolver-oGmO-ew7.js";
2
- export { getRtkPath };
@@ -1,58 +0,0 @@
1
- import { i as execSync } from "./child-process-safe-Cz22RwlG.js";
2
- import { n as glimmervoidHomeDir } from "./config-path-core-DFt-TemS.js";
3
- import { r as resolvePathCommandMatches } from "./spawn-command-Cc40FiZI.js";
4
- import fs from "node:fs";
5
- import path from "node:path";
6
- import os from "node:os";
7
- //#region session/core/rtk-command.ts
8
- function firstExistingFile(candidates, fsApi) {
9
- for (const candidate of candidates) try {
10
- if (fsApi.statSync(candidate).isFile()) return path.resolve(candidate);
11
- } catch {}
12
- return null;
13
- }
14
- function resolveRtkPath({ glimmervoidHome, platform, exec, fsApi }) {
15
- const bundled = firstExistingFile([path.join(glimmervoidHome, "bin", "rtk.exe"), path.join(glimmervoidHome, "bin", "rtk")], fsApi);
16
- if (bundled) return bundled;
17
- const matches = resolvePathCommandMatches("rtk", {
18
- platform,
19
- exec
20
- });
21
- if (matches.length === 0) return null;
22
- const firstMatch = matches[0];
23
- if (!firstMatch) return null;
24
- return path.resolve(firstMatch);
25
- }
26
- function quoteCommandPath(commandPath) {
27
- if (!/\s/.test(commandPath)) return commandPath;
28
- return `"${commandPath}"`;
29
- }
30
- function toForwardSlashes(commandPath) {
31
- return commandPath.replace(/\\/g, "/");
32
- }
33
- function buildRtkHookEntry(rtkPath) {
34
- return {
35
- matcher: "Bash",
36
- hooks: [{
37
- type: "command",
38
- command: `${quoteCommandPath(toForwardSlashes(rtkPath))} hook claude`
39
- }]
40
- };
41
- }
42
- //#endregion
43
- //#region server/rtk-resolver.ts
44
- function resolveRtkPathFromSystem() {
45
- return resolveRtkPath({
46
- glimmervoidHome: glimmervoidHomeDir(os.homedir(), process.env),
47
- platform: process.platform,
48
- exec: execSync,
49
- fsApi: fs
50
- });
51
- }
52
- var cachedRtkPath = null;
53
- function getRtkPath(resolve = resolveRtkPathFromSystem) {
54
- if (!cachedRtkPath) cachedRtkPath = resolve();
55
- return cachedRtkPath;
56
- }
57
- //#endregion
58
- export { buildRtkHookEntry as n, getRtkPath as t };