glimmervoid 0.38.2 → 0.39.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 (37) hide show
  1. package/dist/bin/glimmervoid.js +23 -29
  2. package/dist/chunks/{adapters-CAHxZYT3.js → adapters-B9tP9MXC.js} +26 -14
  3. package/dist/chunks/{adapters-DDjC7_vG.js → adapters-Buu6yI71.js} +1 -1
  4. package/dist/chunks/{agent-api-cli-B5Tm0wXO.js → agent-api-cli-2_RwTTTJ.js} +4 -66
  5. package/dist/chunks/{agent-api-cli-BDu1CxZf.js → agent-api-cli-PfCov-qb.js} +1 -1
  6. package/dist/chunks/agent-api-core-D2HLgBEe.js +180 -0
  7. package/dist/chunks/{agent-setup-cli-DmMfCw5O.js → agent-setup-cli-C1nFdgFg.js} +2 -2
  8. package/dist/chunks/config-store-8Z9vkWvf.js +1 -0
  9. package/dist/chunks/{config-store-BUNZs4j7.js → config-store-n23JDU4E.js} +63 -268
  10. package/dist/chunks/{contracts-HVCEJfxs.js → contracts-DYQW11de.js} +1018 -171
  11. package/dist/chunks/{git-version-rWZjF2Px.js → git-version-DXozXVnb.js} +2 -2
  12. package/dist/chunks/{grok-B6bsCgdd.js → grok-DeGAXgZF.js} +7 -8
  13. package/dist/chunks/{guardrails-deps-Cb-ki4EU.js → guardrails-deps-CLxK4J-g.js} +1 -1
  14. package/dist/chunks/{json-file-CIJf0Cel.js → json-file-DFCTvPjj.js} +3 -7
  15. package/dist/chunks/{main-BNSbP-Yk.js → main-D4uwk-_M.js} +16436 -21253
  16. package/dist/chunks/{pair-cli-DNp8i5L4.js → pair-cli-D9DZBqk0.js} +2 -2
  17. package/dist/chunks/{remote-config-C_s2pnLC.js → remote-config-DiLwnzBq.js} +2 -2
  18. package/dist/chunks/{session-BlT68ppa.js → session-D2EbiysG.js} +20 -32
  19. package/dist/chunks/{session-routes-CT1JrjoT.js → session-routes-BQAZzMKZ.js} +3 -8
  20. package/dist/chunks/{settings-cli-BbzxCyG5.js → settings-cli-DP4t-I9U.js} +3 -3
  21. package/dist/chunks/{ssh-sign-cli-C74BGTQS.js → ssh-sign-cli-D2RIs-iN.js} +2 -2
  22. package/dist/client/assets/index-C0YUJwjz.css +2 -0
  23. package/dist/client/assets/index-w8lG-tk2.js +148 -0
  24. package/dist/client/assets/xterm-kR64YvZ-.js +79 -0
  25. package/dist/client/assets/zod-BRLv4KqJ.js +55 -0
  26. package/dist/client/index.html +5 -2
  27. package/dist/scripts/postinstall-path-check.js +21 -3
  28. package/dist/server/index.js +1 -1
  29. package/package.json +2 -3
  30. package/dist/chunks/agent-api-core-B_mUSenR.js +0 -341
  31. package/dist/chunks/browser-config-BrBT8269.js +0 -762
  32. package/dist/chunks/config-CjawSOBk.js +0 -219
  33. package/dist/chunks/config-store-MAVQhGMh.js +0 -1
  34. package/dist/chunks/factory-D7ryES9n.js +0 -240
  35. package/dist/chunks/knowledge-graph-cli-ByUJoKw_.js +0 -1354
  36. package/dist/client/assets/index-B5uVtedd.css +0 -1
  37. package/dist/client/assets/index-b13-NGGS.js +0 -275
@@ -1,6 +1,6 @@
1
1
  import { r as errorMessage } from "./text-DoirglWV.js";
2
- import { c as resolveConfigPath } from "./config-store-BUNZs4j7.js";
3
- import { c as defaultPairingsPath, i as REVOCATION_PROPAGATION_SECONDS, l as defaultSeenPath, n as normalizeRemoteConfig, o as createPairingsStore, s as createSeenStore } from "./remote-config-C_s2pnLC.js";
2
+ import { c as resolveConfigPath } from "./config-store-n23JDU4E.js";
3
+ import { c as defaultPairingsPath, i as REVOCATION_PROPAGATION_SECONDS, l as defaultSeenPath, n as normalizeRemoteConfig, o as createPairingsStore, s as createSeenStore } from "./remote-config-DiLwnzBq.js";
4
4
  import fs from "node:fs";
5
5
  //#region server/text-format.ts
6
6
  function trimIso(iso) {
@@ -2,8 +2,8 @@ import { n as errorLabel, r as errorMessage } from "./text-DoirglWV.js";
2
2
  import { n as equalsIgnoringCaseOnWindows } from "./paths-Bu4eH1Yd.js";
3
3
  import { n as isRecord } from "./coerce-NSst8oRP.js";
4
4
  import { n as unrefTimer, t as DEFAULT_TIMER_FNS } from "./timer-deps-u2DAQLok.js";
5
- import { a as jsonStateLoadError, d as writeJsonAtomicSync, l as sleepSync, s as loadJsonStateFileSync, u as writeJsonAtomic } from "./json-file-CIJf0Cel.js";
6
- import { o as glimmervoidHomeDir, st as canonicalizePath } from "./config-store-BUNZs4j7.js";
5
+ import { a as jsonStateLoadError, d as writeJsonAtomicSync, l as sleepSync, s as loadJsonStateFileSync, u as writeJsonAtomic } from "./json-file-DFCTvPjj.js";
6
+ import { o as glimmervoidHomeDir, ot as canonicalizePath } from "./config-store-n23JDU4E.js";
7
7
  import fs from "node:fs";
8
8
  import path from "node:path";
9
9
  import crypto from "node:crypto";
@@ -24,11 +24,11 @@ Object.freeze({
24
24
  });
25
25
  Object.freeze({
26
26
  [STATES.DORMANT]: "○",
27
- [STATES.INITIALIZING]: "◌",
27
+ [STATES.INITIALIZING]: "◴",
28
28
  [STATES.STARTING]: "◐",
29
29
  [STATES.RUNNING]: "●",
30
30
  [STATES.WAITING]: "◆",
31
- [STATES.IDLE]: "◍",
31
+ [STATES.IDLE]: "◎",
32
32
  [STATES.FAILED]: "▲",
33
33
  [STATES.DONE]: "■",
34
34
  [STATES.COMPLETE]: "◇"
@@ -855,6 +855,8 @@ var MyPrSearchResponse = z.object({
855
855
  }),
856
856
  errors: z.array(z.unknown()).optional()
857
857
  });
858
+ var SESSION_NAME_PATTERN = /^[a-zA-Z0-9_\-. ()]{1,64}$/;
859
+ var SESSION_NAME_RULE_TEXT = "Session name may only contain letters, numbers, spaces, dashes, dots, underscores, and parentheses (max 64 chars)";
858
860
  var TASK_TITLE_CONTROL_CHARACTERS = /[\x00-\x1f\x7f-\x9f]/;
859
861
  var TaskTitle = z.string().refine((title) => !TASK_TITLE_CONTROL_CHARACTERS.test(title)).trim().max(120);
860
862
  var RefinedTaskTitle = z.object({ title: z.string().nullable() }).strict();
@@ -900,6 +902,17 @@ var ConversationApprovalDecision = z.enum([
900
902
  "acceptForSession",
901
903
  "decline"
902
904
  ]);
905
+ var COHERENCE_HOOKS_REASON_MAX_CHARS = 80;
906
+ var COHERENCE_HOOKS_INACTIVE = Object.freeze({
907
+ notInstalled: "not installed",
908
+ unsupportedVersion: "unsupported version",
909
+ codexHooksUntrusted: "Codex hooks need trust in /hooks"
910
+ });
911
+ var CoherenceHooksState = z.discriminatedUnion("active", [z.object({ active: z.literal(true) }).strict(), z.object({
912
+ active: z.literal(false),
913
+ reason: z.string().min(1).max(COHERENCE_HOOKS_REASON_MAX_CHARS),
914
+ version: z.string().optional()
915
+ }).strict()]);
903
916
  var SessionSnapshot = z.object({
904
917
  id: z.string(),
905
918
  name: z.string(),
@@ -915,6 +928,7 @@ var SessionSnapshot = z.object({
915
928
  isWorktree: z.boolean(),
916
929
  isWorkspace: z.boolean().default(false),
917
930
  isGuarded: z.boolean().default(false),
931
+ isGuardrailsReleased: z.boolean().default(false),
918
932
  resumeSessionId: z.string().nullable(),
919
933
  activeAgents: z.number().int().nonnegative(),
920
934
  awaitingBackgroundTasks: z.boolean(),
@@ -929,8 +943,10 @@ var SessionSnapshot = z.object({
929
943
  mergeStatus: z.string().nullable(),
930
944
  mergeReason: z.string().nullable(),
931
945
  worktreeNotice: z.string().nullable(),
946
+ failureReason: z.string().nullable().optional(),
932
947
  effectiveBase: z.string().nullable(),
933
948
  linkedPrs: z.array(LinkedPr).default([]),
949
+ coherenceHooks: CoherenceHooksState.nullable().default(null),
934
950
  auditLog: z.array(z.unknown())
935
951
  }).passthrough();
936
952
  var AGENT_URL_ENV = "GLIMMERVOID_AGENT_URL";
@@ -952,25 +968,10 @@ var AGENT_API_VERBS = [
952
968
  "spawn",
953
969
  "attention",
954
970
  "board",
955
- "dispatch",
956
- "reopen",
957
- "cancel",
958
971
  "push",
959
972
  "edit",
960
- "limits",
961
- "factory-status",
962
- "factory-retry",
963
- "factory-setup",
964
- "factory-queue"
965
- ];
966
- var ORCHESTRATOR_AGENT_VERBS = [
967
- "dispatch",
968
- "reopen",
969
- "cancel"
973
+ "limits"
970
974
  ];
971
- var AgentFactoryStatusRequest = z.object({ projectId: z.string().trim().min(1).max(128).optional() }).strict();
972
- var AgentFactoryRetryRequest = z.object({ intentId: z.string().trim().min(1).max(128) }).strict();
973
- var AgentFactorySetupRequest = z.object({}).strict();
974
975
  var AgentSpawnRequest = z.object({
975
976
  prompt: z.string({ error: "prompt must be a string" }).min(1, { error: "prompt must not be empty" }).max(2e4, { error: "prompt must be at most 20000 characters" }).refine((prompt) => !prompt.trimStart().startsWith("-"), { message: "prompt must not start with a dash, which the agent CLI would read as an option" }),
976
977
  name: z.string({ error: "name must be a string" }).min(1, { error: "name must not be empty" }).max(200, { error: "name must be at most 200 characters" }).optional(),
@@ -1018,18 +1019,5 @@ var AgentLimitsReply = z.object({
1018
1019
  route: z.string()
1019
1020
  }).strict())
1020
1021
  }).strict().extend({ ok: z.literal(true) }).strict();
1021
- var AgentDispatchRequest = z.object({
1022
- workId: z.string().regex(/^wrk-[0-9a-f]{16}$/).optional(),
1023
- readyIntent: z.string().regex(/^wrk-[0-9a-f]{16}$/).optional()
1024
- }).strict().refine((request) => Boolean(request.workId) !== Boolean(request.readyIntent), "Expected exactly one work id or ready intent");
1025
- var AgentTicketRequest = z.object({ workId: z.string({ error: "workId must be a string" }).regex(/^wrk-[0-9a-f]{16}$/, { error: "workId must match wrk-[0-9a-f]{16}" }) }).strict();
1026
- z.discriminatedUnion("ok", [z.object({
1027
- ok: z.literal(true),
1028
- workId: z.string(),
1029
- state: z.enum(["open", "cancelled"])
1030
- }), z.object({
1031
- ok: z.literal(false),
1032
- reason: z.string()
1033
- })]);
1034
1022
  //#endregion
1035
- export { SessionPrLinks as $, SessionState as A, FULL_SHA_RE as At, MyPrKeepMergeableResult as B, KILLABLE_STATES as Bt, SESSION_COMMANDS as C, TeamReviewThreadCommentsResponse as Ct, SSH_SIGN_BODY_CAP_BYTES as D, decisionAsIfApprovalRequired as Dt, SIGN_URL_ENV as E, canApproveAfterComment as Et, LinkedPr as F, REPO_SLUG_RE as Ft, MyPrMergeWhenReadyRequest as G, MyPrMergeRequest as H, RESTARTABLE_STATES as Ht, MyPrAutoRebase as I, repoParts as It, MyPrSearchResponse as J, MyPrMergeWhenReadyResult as K, MyPrCheckContext as L, GithubPollingRefreshRequest as Lt, SshSignRequest as M, shortSha as Mt, TASK_TITLE_CONTROL_CHARACTERS as N, GH_SEGMENT as Nt, SessionDoc as O, hasRequiredActionHead as Ot, TaskTitle as P, NODE_ID_RE as Pt, MyPrsStatus as Q, MyPrCheckContextsResponse as R, GithubPollingRefreshResult as Rt, RefinedTaskTitle as S, TeamReviewStatus as St, SESSION_DOC_PATH_MAX_CHARS as T, TeamReviewThreadsRepository as Tt, MyPrMergeResult as U, STATES as Ut, MyPrMergeMethod as V, MERGEABLE_LIVE_STATES as Vt, MyPrMergeStateResponse as W, MyPrThreadsResponse as X, MyPrThreadNode as Y, MyPrsState as Z, ConversationApproval as _, TeamReviewActionRequest as _t, AgentDispatchRequest as a, GithubReviewState as at, ORCHESTRATOR_AGENT_VERBS as b, TeamReviewResolveResponse as bt, AgentFactorySetupRequest as c, QueuedReview as ct, AgentSpawnRequest as d, ReviewDraft as dt, repositoryName as et, AgentTicketRequest as f, ReviewFinding as ft, ConversationAnswers as g, SearchedPr as gt, CONVERSATION_TOOL_RESULT_HOOK_EVENT as h, ReviewVerdict as ht, AgentAttentionRequest as i, GithubReviewDecision as it, SshSignReply as j, HEX_SHA_RE as jt, SessionSnapshot as k, hasStandingViewerApproval as kt, AgentFactoryStatusRequest as l, ReviewChecksState as lt, CONVERSATION_PERMISSION_HOOK_EVENT as m, ReviewThreadId as mt, AGENT_URL_ENV as n, DECIDING_REVIEW_STATES as nt, AgentEditRequest as o, PostingPlan as ot, CONVERSATION_APPROVAL_SUMMARY_MAX_CHARS as p, ReviewResult as pt, MyPrSearchNode as q, ASK_USER_QUESTION_TOOL_NAME as r, FindingSeverity as rt, AgentFactoryRetryRequest as s, PrDetail as st, AGENT_API_VERBS as t, CommitSha as tt, AgentLimitsReply as u, ReviewComment as ut, ConversationApprovalDecision as v, TeamReviewActionResult as vt, SESSION_DOC_BODY_CAP_BYTES as w, TeamReviewThreadResult as wt, PendingWakeup as x, TeamReviewStateEntry as xt, ConversationQuestion as y, TeamReviewCompareFiles as yt, MyPrKeepMergeableRequest as z, githubPollingShape as zt };
1023
+ export { CommitSha as $, SshSignRequest as A, shortSha as At, MyPrMergeRequest as B, RESTARTABLE_STATES as Bt, SESSION_NAME_RULE_TEXT as C, TeamReviewThreadsRepository as Ct, SessionSnapshot as D, hasStandingViewerApproval as Dt, SessionDoc as E, hasRequiredActionHead as Et, MyPrCheckContext as F, GithubPollingRefreshRequest as Ft, MyPrSearchNode as G, MyPrMergeStateResponse as H, MyPrCheckContextsResponse as I, GithubPollingRefreshResult as It, MyPrThreadsResponse as J, MyPrSearchResponse as K, MyPrKeepMergeableRequest as L, githubPollingShape as Lt, TaskTitle as M, NODE_ID_RE as Mt, LinkedPr as N, REPO_SLUG_RE as Nt, SessionState as O, FULL_SHA_RE as Ot, MyPrAutoRebase as P, repoParts as Pt, repositoryName as Q, MyPrKeepMergeableResult as R, KILLABLE_STATES as Rt, SESSION_NAME_PATTERN as S, TeamReviewThreadResult as St, SSH_SIGN_BODY_CAP_BYTES as T, decisionAsIfApprovalRequired as Tt, MyPrMergeWhenReadyRequest as U, MyPrMergeResult as V, STATES as Vt, MyPrMergeWhenReadyResult as W, MyPrsStatus as X, MyPrsState as Y, SessionPrLinks as Z, PendingWakeup as _, TeamReviewCompareFiles as _t, AgentEditRequest as a, PrDetail as at, SESSION_DOC_BODY_CAP_BYTES as b, TeamReviewStatus as bt, COHERENCE_HOOKS_INACTIVE as c, ReviewComment as ct, CONVERSATION_TOOL_RESULT_HOOK_EVENT as d, ReviewResult as dt, DECIDING_REVIEW_STATES as et, CoherenceHooksState as f, ReviewThreadId as ft, ConversationQuestion as g, TeamReviewActionResult as gt, ConversationApprovalDecision as h, TeamReviewActionRequest as ht, AgentAttentionRequest as i, PostingPlan as it, TASK_TITLE_CONTROL_CHARACTERS as j, GH_SEGMENT as jt, SshSignReply as k, HEX_SHA_RE as kt, CONVERSATION_APPROVAL_SUMMARY_MAX_CHARS as l, ReviewDraft as lt, ConversationApproval as m, SearchedPr as mt, AGENT_URL_ENV as n, GithubReviewDecision as nt, AgentLimitsReply as o, QueuedReview as ot, ConversationAnswers as p, ReviewVerdict as pt, MyPrThreadNode as q, ASK_USER_QUESTION_TOOL_NAME as r, GithubReviewState as rt, AgentSpawnRequest as s, ReviewChecksState as st, AGENT_API_VERBS as t, FindingSeverity as tt, CONVERSATION_PERMISSION_HOOK_EVENT as u, ReviewFinding as ut, RefinedTaskTitle as v, TeamReviewResolveResponse as vt, SIGN_URL_ENV as w, canApproveAfterComment as wt, SESSION_DOC_PATH_MAX_CHARS as x, TeamReviewThreadCommentsResponse as xt, SESSION_COMMANDS as y, TeamReviewStateEntry as yt, MyPrMergeMethod as z, MERGEABLE_LIVE_STATES as zt };
@@ -1,4 +1,4 @@
1
- import { C as SESSION_COMMANDS } from "./session-BlT68ppa.js";
1
+ import { y as SESSION_COMMANDS } from "./session-D2EbiysG.js";
2
2
  //#region session/core/session-routes.ts
3
3
  var SUPERVISION_LINE = "Glimmervoid supervises this session. Run glimmervoid --help for the commands it gives you and this session's limits.";
4
4
  var GUARDRAILS_LINE = "Its guardrails are OS-enforced, so a read, write or connection they refuse will not succeed on retry.";
@@ -41,11 +41,7 @@ function pushRoute({ isEphemeral, isSpawnedChild, hasOwnWorktree }) {
41
41
  };
42
42
  return ANSWERS;
43
43
  }
44
- function spawnRoute({ isEphemeral, isSpawnedChild, factoryRole }) {
45
- if (factoryRole === "worker") return {
46
- answers: false,
47
- reason: "the factory starts and counts its workers, so a worker may not spawn a session"
48
- };
44
+ function spawnRoute({ isEphemeral, isSpawnedChild }) {
49
45
  if (isSpawnedChild) return {
50
46
  answers: false,
51
47
  reason: "a spawned session may not spawn another"
@@ -56,9 +52,8 @@ function spawnRoute({ isEphemeral, isSpawnedChild, factoryRole }) {
56
52
  };
57
53
  return ANSWERS;
58
54
  }
59
- function hasOperatorCard({ isEphemeral, isSpawnedChild, factoryRole }) {
55
+ function hasOperatorCard({ isEphemeral, isSpawnedChild }) {
60
56
  if (!isEphemeral) return true;
61
- if (factoryRole !== null) return true;
62
57
  return isSpawnedChild;
63
58
  }
64
59
  function attentionRoute(caller) {
@@ -1,10 +1,10 @@
1
1
  import { r as errorMessage, t as errorCode } from "./text-DoirglWV.js";
2
- import "./session-BlT68ppa.js";
2
+ import "./session-D2EbiysG.js";
3
3
  import { t as renderTable } from "./ascii-figure-core-pDAwtlKO.js";
4
4
  import { n as glimmervoidHomeDir, t as decideConfigPath } from "./config-path-core-DFt-TemS.js";
5
5
  import { n as isRecord } from "./coerce-NSst8oRP.js";
6
- import { $ as withEnvSecrets, A as settingsOf, C as deleteValueAtPath, D as scoreSettingsSearch, E as parsePosthogProjectSelection, M as FILE_ONLY_GROUPS, N as SETTINGS_REGISTRY, O as setValueAtPath, S as cloneValue, T as hasScaledUnit, X as ENV_SECRET_BINDINGS, Z as readEnvSecrets, j as valueAtPath, k as settingsGroupOf, l as saveConfigFileOnce, s as loadConfigFile, u as validateConfig, w as displayText, x as SETTINGS_INDEX } from "./config-store-BUNZs4j7.js";
7
- import { r as BrowserConfig } from "./config-CjawSOBk.js";
6
+ import { A as settingsOf, C as deleteValueAtPath, D as scoreSettingsSearch, E as parsePosthogProjectSelection, M as FILE_ONLY_GROUPS, N as SETTINGS_REGISTRY, O as setValueAtPath, Q as withEnvSecrets, S as cloneValue, T as hasScaledUnit, X as readEnvSecrets, Y as ENV_SECRET_BINDINGS, j as valueAtPath, k as settingsGroupOf, l as saveConfigFileOnce, s as loadConfigFile, u as validateConfig, w as displayText, x as SETTINGS_INDEX } from "./config-store-n23JDU4E.js";
7
+ import { Q as BrowserConfig } from "./contracts-DYQW11de.js";
8
8
  import fs from "node:fs";
9
9
  import os from "node:os";
10
10
  import { parseArgs } from "node:util";
@@ -1,8 +1,8 @@
1
1
  import { r as errorMessage } from "./text-DoirglWV.js";
2
- import { E as SIGN_URL_ENV, j as SshSignReply } from "./session-BlT68ppa.js";
2
+ import { k as SshSignReply, w as SIGN_URL_ENV } from "./session-D2EbiysG.js";
3
3
  import { n as execFileAsync, o as spawn } from "./child-process-safe-CbQnyh7D.js";
4
4
  import { a as isLoopbackHostname } from "./hook-relay-core-DA_bz2KA.js";
5
- import { t as postToAgentIngress } from "./agent-api-cli-B5Tm0wXO.js";
5
+ import { t as postToAgentIngress } from "./agent-api-cli-2_RwTTTJ.js";
6
6
  import { l as parseSshPublicKey } from "./ssh-signing-core-CRhVVWNW.js";
7
7
  import path from "node:path";
8
8
  import fsp from "node:fs/promises";