glimmervoid 0.35.1 → 0.36.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 (38) hide show
  1. package/README.md +2 -0
  2. package/dist/bin/glimmervoid.js +17 -12
  3. package/dist/chunks/{adapters-B37wqNti.js → adapters-BVozg-Lg.js} +1 -1
  4. package/dist/chunks/{adapters-CADejSpq.js → adapters-BdnLyJjf.js} +10 -49
  5. package/dist/chunks/{agent-api-cli-CRj_FYbz.js → agent-api-cli-DIqRLvu3.js} +1 -1
  6. package/dist/chunks/{agent-api-cli-vGwstJ1j.js → agent-api-cli-d-Bgsshx.js} +3 -3
  7. package/dist/chunks/{agent-api-core-D1233u1U.js → agent-api-core-BUC9WND7.js} +2 -2
  8. package/dist/chunks/{agent-setup-cli-BTAFcckd.js → agent-setup-cli-CH7EHsAX.js} +1 -1
  9. package/dist/chunks/{config-rPbbL4nW.js → config-CuZ16F9W.js} +47 -771
  10. package/dist/chunks/config-store-LqQ7MuyV.js +4181 -0
  11. package/dist/chunks/config-store-tVmt_nfm.js +1 -0
  12. package/dist/chunks/{contracts-DjIgIuDk.js → contracts-BLZAOP57.js} +55 -6
  13. package/dist/chunks/{grok-KKgdSe-7.js → grok-Ch4-35_r.js} +3 -3
  14. package/dist/chunks/{hook-command-core-DclEoE9e.js → hook-command-core-qTNK-xMF.js} +4 -1
  15. package/dist/chunks/{hook-tools-UX2fmt81.js → hook-tools-BkxllUHE.js} +9 -16
  16. package/dist/chunks/{knowledge-graph-cli-Rj5nj87L.js → knowledge-graph-cli-DD7QvcFd.js} +1 -1
  17. package/dist/chunks/{main-C-T2Uk20.js → main-Rmo83Ow-.js} +3075 -832
  18. package/dist/chunks/{pair-cli-Dcyzv3In.js → pair-cli-DzFeAmq5.js} +2 -2
  19. package/dist/chunks/{remote-config-Dd1T-VJA.js → remote-config-CPdSF2Xi.js} +1 -1
  20. package/dist/chunks/{rtk-hook-core-BmEz2aq9.js → rtk-hook-core-VrUafGAp.js} +15 -5
  21. package/dist/chunks/rtk-resolver-B8BPgN9L.js +1 -0
  22. package/dist/chunks/{rtk-resolver-B9pzjLsM.js → rtk-resolver-C_micGrL.js} +1 -1
  23. package/dist/chunks/session-B8RhqQJe.js +986 -0
  24. package/dist/chunks/{session-routes-BYy3am9m.js → session-routes-DB5aDKsx.js} +1 -1
  25. package/dist/chunks/settings-cli-C2TY6hl-.js +484 -0
  26. package/dist/chunks/{ssh-sign-cli-DPHpT22B.js → ssh-sign-cli-C2nUwJC-.js} +2 -2
  27. package/dist/client/assets/index-BIaSyXwH.css +1 -0
  28. package/dist/client/assets/index-Ddu7M4Ad.js +259 -0
  29. package/dist/client/index.html +5 -3
  30. package/dist/server/index.js +1 -1
  31. package/dist/session/hook-tool-relay.js +3 -3
  32. package/package.json +3 -3
  33. package/dist/chunks/config-store-BeIxAZNn.js +0 -1
  34. package/dist/chunks/config-store-BtsYbNC3.js +0 -1713
  35. package/dist/chunks/rtk-resolver-SWU5VVM7.js +0 -1
  36. package/dist/chunks/session-D6xXN0UU.js +0 -232
  37. package/dist/client/assets/index-CUxRHbCS.js +0 -254
  38. package/dist/client/assets/index-DE2GUmqs.css +0 -1
package/README.md CHANGED
@@ -7,6 +7,8 @@
7
7
 
8
8
  **Mission control for your coding agents. Run dozens of Claude Code, Codex and Grok sessions at once. See every one. Miss nothing.**
9
9
 
10
+ Website: [glimmervoid.dev](https://glimmervoid.dev)
11
+
10
12
  Running more than a couple of coding agents at once turns into alt-tabbing between terminal windows, missing the exact moment one finishes or silently blocks on a prompt, and merging work you never watched happen. Glimmervoid is one browser dashboard with live terminal output for every session, exact status instead of a guess, a notification the moment an agent needs you, and per-agent git worktrees you can review and merge without leaving the page.
11
13
 
12
14
  Glimmervoid is an agent orchestrator, sometimes called an agent manager or an agentic development environment. It is not an agent harness: Claude Code, Codex and Grok are the harnesses, the loop that turns a model into an agent. Glimmervoid runs those harnesses unmodified, as real processes in real terminals on your own machine, and supervises all of them from one screen. No cloud service, no account.
@@ -2,7 +2,7 @@
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-BkeftE60.js";
5
- import { t as AGENT_API_VERBS } from "../chunks/session-D6xXN0UU.js";
5
+ import { t as AGENT_API_VERBS } from "../chunks/session-B8RhqQJe.js";
6
6
  import { i as execSync } from "../chunks/child-process-safe-CbQnyh7D.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";
@@ -112,6 +112,7 @@ Commands:
112
112
  limits From inside a Glimmervoid session, list which of these commands answer and what its guardrails block
113
113
  ssh-sign What git runs inside a Glimmervoid session to sign a commit with the operator's forwarded ssh agent
114
114
  kg [command] Experimental typed knowledge and task graph (Settings > Lanes > Knowledge graph)
115
+ settings <cmd> Read and change config.json: list, get, set, unset, search, schema (each takes --json)
115
116
 
116
117
  Options:
117
118
  --name <label> Label for the device being paired (with: pair)
@@ -138,33 +139,37 @@ var SUBCOMMAND_RUNNERS = new Map([
138
139
  return 0;
139
140
  }],
140
141
  ["pair", async (subcommandArgs) => {
141
- const { runPairCli } = await import("../chunks/pair-cli-Dcyzv3In.js");
142
+ const { runPairCli } = await import("../chunks/pair-cli-DzFeAmq5.js");
142
143
  return runPairCli(subcommandArgs);
143
144
  }],
144
145
  ["agent", async (subcommandArgs) => {
145
- const { runAgentSetupCli } = await import("../chunks/agent-setup-cli-BTAFcckd.js");
146
+ const { runAgentSetupCli } = await import("../chunks/agent-setup-cli-CH7EHsAX.js");
146
147
  return runAgentSetupCli(subcommandArgs);
147
148
  }],
148
149
  ["kg", async (subcommandArgs) => {
149
- const { runKnowledgeGraphCommand } = await import("../chunks/knowledge-graph-cli-Rj5nj87L.js");
150
+ const { runKnowledgeGraphCommand } = await import("../chunks/knowledge-graph-cli-DD7QvcFd.js");
150
151
  return runKnowledgeGraphCommand(subcommandArgs);
151
152
  }],
153
+ ["settings", async (subcommandArgs) => {
154
+ const { runSettingsCommand } = await import("../chunks/settings-cli-C2TY6hl-.js");
155
+ return runSettingsCommand(subcommandArgs);
156
+ }],
152
157
  ["visions", async (subcommandArgs) => {
153
158
  const { runVisionsCli } = await import("../chunks/visions-cli-CYujESdJ.js");
154
159
  return runVisionsCli(subcommandArgs);
155
160
  }],
156
161
  ["ssh-sign", async (subcommandArgs) => {
157
- const { runSshSignCli } = await import("../chunks/ssh-sign-cli-DPHpT22B.js");
162
+ const { runSshSignCli } = await import("../chunks/ssh-sign-cli-C2nUwJC-.js");
158
163
  return runSshSignCli(subcommandArgs);
159
164
  }],
160
165
  ...AGENT_API_VERBS.map((verb) => [verb, async (subcommandArgs, subcommandName) => {
161
- const { runAgentApiCli } = await import("../chunks/agent-api-cli-CRj_FYbz.js");
166
+ const { runAgentApiCli } = await import("../chunks/agent-api-cli-DIqRLvu3.js");
162
167
  return runAgentApiCli([subcommandName, ...subcommandArgs]);
163
168
  }])
164
169
  ]);
165
170
  async function printSessionLimits() {
166
171
  if (!process.env["GLIMMERVOID_AGENT_URL"]) return;
167
- const { sessionLimitsHelpLines } = await import("../chunks/agent-api-cli-CRj_FYbz.js");
172
+ const { sessionLimitsHelpLines } = await import("../chunks/agent-api-cli-DIqRLvu3.js");
168
173
  const limitsLines = await sessionLimitsHelpLines();
169
174
  console.log(`\n${limitsLines.join("\n")}`);
170
175
  }
@@ -221,7 +226,7 @@ async function readDeclaredCustomAgents() {
221
226
  declared: [],
222
227
  error: null
223
228
  };
224
- const { loadConfigFile } = await import("../chunks/config-store-BeIxAZNn.js");
229
+ const { loadConfigFile } = await import("../chunks/config-store-tVmt_nfm.js");
225
230
  try {
226
231
  const loaded = loadConfigFile(decided.path, { exitOnError: false });
227
232
  if (!loaded.config) return {
@@ -297,7 +302,7 @@ async function runDoctor() {
297
302
  }
298
303
  switchSection("Agents");
299
304
  try {
300
- const { listAgentIds, describeAgentResolvability, setCustomAgents } = await import("../chunks/adapters-B37wqNti.js");
305
+ const { listAgentIds, describeAgentResolvability, setCustomAgents } = await import("../chunks/adapters-BVozg-Lg.js");
301
306
  const declaredCustomAgents = await readDeclaredCustomAgents();
302
307
  if (declaredCustomAgents.error) line("config", declaredCustomAgents.error);
303
308
  setCustomAgents(declaredCustomAgents.declared);
@@ -305,7 +310,7 @@ async function runDoctor() {
305
310
  const { label, path: resolvedPath } = describeAgentResolvability(id);
306
311
  line(`${id} (${label})`, resolvedPath ?? "not found on PATH");
307
312
  }
308
- const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-BTAFcckd.js");
313
+ const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-CH7EHsAX.js");
309
314
  const grokSetup = inspectGrokAgentSetup();
310
315
  line("grok hook setup", `${grokSetup.classification}: ${grokSetup.filePath}`);
311
316
  } catch (err) {
@@ -313,7 +318,7 @@ async function runDoctor() {
313
318
  }
314
319
  switchSection("rtk");
315
320
  try {
316
- const { getRtkPath } = await import("../chunks/rtk-resolver-SWU5VVM7.js");
321
+ const { getRtkPath } = await import("../chunks/rtk-resolver-B8BPgN9L.js");
317
322
  line("rtk", getRtkPath() || "not installed (Glimmervoid installs it when the rtk setting is on)");
318
323
  } catch (err) {
319
324
  line("rtk", `probe failed: ${firstLine(errorText(err))}`);
@@ -322,7 +327,7 @@ async function runDoctor() {
322
327
  try {
323
328
  const { resolvePackageBin } = await import("../chunks/runtime-paths-DSmormp7.js");
324
329
  const { execFileSync } = await import("../chunks/child-process-safe-ChRmWAJP.js");
325
- const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-BTAFcckd.js");
330
+ const { inspectGrokAgentSetup } = await import("../chunks/agent-setup-cli-CH7EHsAX.js");
326
331
  const binPath = resolvePackageBin("cc-safety-net", "cc-safety-net");
327
332
  line("Sane YOLO", binPath || "not installed");
328
333
  if (binPath) line("cc-safety-net version", execFileSync(process.execPath, [binPath, "--version"], {
@@ -1 +1 @@
1
- export { a as describeAgentResolvability, l as listAgentIds, d as setCustomAgents } from "./adapters-CADejSpq.js";
1
+ export { a as describeAgentResolvability, l as listAgentIds, d as setCustomAgents } from "./adapters-BdnLyJjf.js";
@@ -1,14 +1,13 @@
1
1
  import { o as relayPath } from "./runtime-paths-BkeftE60.js";
2
- import { A as toolDetailFieldValue, d as PROMPT_DETAIL_HIDDEN_CHARACTERS, k as firstDetailLine, p as PendingPromptQuestion } from "./session-D6xXN0UU.js";
3
2
  import { r as execFileSync } from "./child-process-safe-CbQnyh7D.js";
4
3
  import { n as resolveAgentCommand, t as buildAgentSpawnCommand } from "./spawn-command-Cc40FiZI.js";
5
- import { n as isRecord, s as rawTextOr } from "./coerce-NSst8oRP.js";
4
+ import { s as rawTextOr } from "./coerce-NSst8oRP.js";
6
5
  import { r as nextBackoffMs } from "./backoff-DjVpfHk7.js";
7
- import { l as supervisionLine } from "./session-routes-BYy3am9m.js";
8
- import { c as buildAgentEnv, i as isSpinnerChar, n as classifyAgentTitle, r as isBrailleChar, t as grok } from "./grok-KKgdSe-7.js";
9
- import { t as buildHookCommand } from "./hook-command-core-DclEoE9e.js";
10
- import "./contracts-DjIgIuDk.js";
11
- import { n as mergeCodexPreToolUse, t as HOOK_TOOLS } from "./hook-tools-UX2fmt81.js";
6
+ import { l as supervisionLine } from "./session-routes-DB5aDKsx.js";
7
+ import { c as buildAgentEnv, i as isSpinnerChar, n as classifyAgentTitle, r as isBrailleChar, t as grok } from "./grok-Ch4-35_r.js";
8
+ import { t as buildHookCommand } from "./hook-command-core-qTNK-xMF.js";
9
+ import "./contracts-BLZAOP57.js";
10
+ import { n as mergeCodexPreToolUse, t as HOOK_TOOLS } from "./hook-tools-BkxllUHE.js";
12
11
  import fs from "node:fs";
13
12
  import path from "node:path";
14
13
  //#region session/adapters/claude-code.ts
@@ -62,50 +61,12 @@ function mapHookPromptKind$1(event, payload) {
62
61
  }
63
62
  return null;
64
63
  }
65
- function mapHookPromptDetail(event, payload) {
64
+ function mapHookPromptToolName(event, payload) {
66
65
  if (String(event || "").toLowerCase() !== "permissionrequest") return null;
67
66
  if (mapHookPromptKind$1(event, payload) !== "permission") return null;
68
67
  const toolName = payload?.tool_name;
69
68
  if (typeof toolName !== "string" || !toolName) return null;
70
- const fieldValue = toolDetailFieldValue(toolName, payload?.tool_input);
71
- const summary = fieldValue === null ? "" : firstDetailLine(fieldValue);
72
- const isComplete = isWholeBashCommandShown(toolName, payload?.tool_input, fieldValue, summary);
73
- return {
74
- toolName: firstDetailLine(toolName),
75
- summary,
76
- isComplete,
77
- question: answerableQuestionOf(toolName, payload?.tool_input)
78
- };
79
- }
80
- function answerableQuestionOf(toolName, toolInput) {
81
- if (toolName !== "AskUserQuestion" || !isRecord(toolInput)) return null;
82
- const questions = toolInput.questions;
83
- if (!Array.isArray(questions) || questions.length !== 1) return null;
84
- const [entry] = questions;
85
- if (!isRecord(entry) || typeof entry.question !== "string" || !Array.isArray(entry.options)) return null;
86
- const optionLabels = entry.options.flatMap((option) => isRecord(option) && typeof option.label === "string" ? [option.label] : []);
87
- if (optionLabels.length !== entry.options.length) return null;
88
- const parsedQuestion = PendingPromptQuestion.safeParse({
89
- text: entry.question,
90
- options: optionLabels,
91
- multiSelect: entry.multiSelect === true
92
- });
93
- return parsedQuestion.success ? parsedQuestion.data : null;
94
- }
95
- var DISPLAY_IRRELEVANT_BASH_INPUT_KEYS = /* @__PURE__ */ new Set([
96
- "command",
97
- "description",
98
- "timeout"
99
- ]);
100
- function hasOnlyDisplayIrrelevantBashInputKeys(toolInput) {
101
- if (!toolInput || typeof toolInput !== "object") return false;
102
- return Reflect.ownKeys(toolInput).every((key) => typeof key === "string" && DISPLAY_IRRELEVANT_BASH_INPUT_KEYS.has(key));
103
- }
104
- function isWholeBashCommandShown(toolName, toolInput, fieldValue, summary) {
105
- if (toolName !== "Bash" || fieldValue === null) return false;
106
- if (!hasOnlyDisplayIrrelevantBashInputKeys(toolInput)) return false;
107
- if (PROMPT_DETAIL_HIDDEN_CHARACTERS.test(fieldValue)) return false;
108
- return summary === fieldValue;
69
+ return toolName;
109
70
  }
110
71
  function mapHookToSignal$1(event, payload) {
111
72
  switch (String(event || "").toLowerCase()) {
@@ -141,7 +102,7 @@ var hooks$1 = {
141
102
  mapSignal: mapHookToSignal$1,
142
103
  mapConfidence: mapHookConfidence$1,
143
104
  mapPromptKind: mapHookPromptKind$1,
144
- mapPromptDetail: mapHookPromptDetail,
105
+ mapPromptToolName: mapHookPromptToolName,
145
106
  injection: { kind: "settings-file" }
146
107
  };
147
108
  function resolveCommand$1({ platform, execFile = execFileSync, pathExists = fs.existsSync } = {}) {
@@ -239,7 +200,7 @@ var claudeCode = {
239
200
  mapHookToSignal: mapHookToSignal$1,
240
201
  mapHookConfidence: mapHookConfidence$1,
241
202
  mapHookPromptKind: mapHookPromptKind$1,
242
- mapHookPromptDetail
203
+ mapHookPromptToolName
243
204
  };
244
205
  //#endregion
245
206
  //#region server/usage/core/usage-scan-core.ts
@@ -1 +1 @@
1
- export { n as runAgentApiCli, r as sessionLimitsHelpLines } from "./agent-api-cli-vGwstJ1j.js";
1
+ export { n as runAgentApiCli, r as sessionLimitsHelpLines } from "./agent-api-cli-d-Bgsshx.js";
@@ -1,10 +1,10 @@
1
1
  import { t as errorCode } from "./text-DoirglWV.js";
2
- import { a as AgentDispatchRequest, l as AgentTicketRequest, n as AGENT_URL_ENV, s as AgentLimitsReply } from "./session-D6xXN0UU.js";
2
+ import { a as AgentDispatchRequest, l as AgentTicketRequest, n as AGENT_URL_ENV, s as AgentLimitsReply } from "./session-B8RhqQJe.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
5
  import { t as parseJsonOrNull } from "./json-core-dfa_7Fak.js";
6
- import { a as formatSessionLimits } from "./session-routes-BYy3am9m.js";
7
- import { d as isOrchestratorAgentVerb, u as isAgentApiVerb } from "./agent-api-core-D1233u1U.js";
6
+ import { a as formatSessionLimits } from "./session-routes-DB5aDKsx.js";
7
+ import { d as isOrchestratorAgentVerb, u as isAgentApiVerb } from "./agent-api-core-BUC9WND7.js";
8
8
  import path from "node:path";
9
9
  import http from "node:http";
10
10
  //#region server/agent-api-cli.ts
@@ -1,5 +1,5 @@
1
- import { a as AgentDispatchRequest, c as AgentSpawnRequest, i as AgentAttentionRequest, o as AgentEditRequest, t as AGENT_API_VERBS, u as ORCHESTRATOR_AGENT_VERBS } from "./session-D6xXN0UU.js";
2
- import { c as spawnRoute, i as editRoute, n as attentionRoute, s as pushRoute, t as NO_OWN_WORKTREE_REASON } from "./session-routes-BYy3am9m.js";
1
+ import { a as AgentDispatchRequest, c as AgentSpawnRequest, f as ORCHESTRATOR_AGENT_VERBS, i as AgentAttentionRequest, o as AgentEditRequest, t as AGENT_API_VERBS } from "./session-B8RhqQJe.js";
2
+ import { c as spawnRoute, i as editRoute, n as attentionRoute, s as pushRoute, t as NO_OWN_WORKTREE_REASON } from "./session-routes-DB5aDKsx.js";
3
3
  import crypto from "node:crypto";
4
4
  var MAX_SPAWNS_IN_FLIGHT = 1;
5
5
  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-KKgdSe-7.js";
2
+ import { a as classifyGrokHooksFile, o as renderGrokHooksFile, t as grok } from "./grok-Ch4-35_r.js";
3
3
  import { p as writeTextAtomicSync } from "./json-file-BaxGcB2R.js";
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";