glimmervoid 0.44.1 → 0.44.2

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 (163) hide show
  1. package/README.md +1 -1
  2. package/dist/bin/glimmervoid.js +8 -8
  3. package/dist/chunks/{adapters-BsoXEvlZ.js → adapters-7AfJ6yb3.js} +2 -2
  4. package/dist/chunks/{adapters-B2IgKmuZ.js → adapters-B_ss_kZh.js} +1 -1
  5. package/dist/chunks/{agent-api-cli-B-QxkZAQ.js → agent-api-cli-prUJ5ZGN.js} +1 -1
  6. package/dist/chunks/{agent-api-cli-DIl92JjQ.js → agent-api-cli-zwuWZlwk.js} +1 -1
  7. package/dist/chunks/{agent-api-core-BCFplxXu.js → agent-api-core-DQwd2ClI.js} +1 -1
  8. package/dist/chunks/{config-Dh4e-Mkv.js → config-DlKkg6IX.js} +10 -1
  9. package/dist/chunks/{config-store-CEsetno2.js → config-store-DIrwF5iQ.js} +2 -2
  10. package/dist/chunks/config-store-LYSRHNQs.js +1 -0
  11. package/dist/chunks/{contracts-dj-GFptp.js → contracts-lxJ0sQEl.js} +19 -10
  12. package/dist/chunks/{main-CA3ONCUS.js → main-BCbulgNv.js} +212 -20
  13. package/dist/chunks/{pair-cli-CWHMbInF.js → pair-cli-B3VRcrHm.js} +2 -2
  14. package/dist/chunks/{remote-config-CtcoO10O.js → remote-config-C91HwjWq.js} +1 -1
  15. package/dist/chunks/{settings-cli-DGOkkmW-.js → settings-cli-C9eCc60b.js} +4 -4
  16. package/dist/chunks/{settings-readout-core-BVb6tTLq.js → settings-readout-core-DK1m5TUq.js} +1 -1
  17. package/dist/chunks/{ssh-sign-cli-BdvvBKkj.js → ssh-sign-cli-DCnHgHqo.js} +1 -1
  18. package/dist/client/assets/action-status-DXcC95xv.js +1 -0
  19. package/dist/client/assets/action-status-DXcC95xv.js.br +0 -0
  20. package/dist/client/assets/benchmark-panel-Cssmnd3z.js +1 -0
  21. package/dist/client/assets/benchmark-panel-Cssmnd3z.js.br +0 -0
  22. package/dist/client/assets/dom-helpers-CcEFPh-F.js +4 -0
  23. package/dist/client/assets/dom-helpers-CcEFPh-F.js.br +0 -0
  24. package/dist/client/assets/hooks-panel-Cli8EeBB.js +1 -0
  25. package/dist/client/assets/hooks-panel-Cli8EeBB.js.br +0 -0
  26. package/dist/client/assets/index-C3nOrTwM.css +2 -0
  27. package/dist/client/assets/index-C3nOrTwM.css.br +0 -0
  28. package/dist/client/assets/index-C8u3ZjM3.js +173 -0
  29. package/dist/client/assets/index-C8u3ZjM3.js.br +0 -0
  30. package/dist/client/assets/issues-panel-Bev1wadi.js +1 -0
  31. package/dist/client/assets/issues-panel-Bev1wadi.js.br +0 -0
  32. package/dist/client/assets/modal-CvDX5-_2.js +1 -0
  33. package/dist/client/assets/modal-CvDX5-_2.js.br +0 -0
  34. package/dist/client/assets/poll-ago-Dj148faJ.js +1 -0
  35. package/dist/client/assets/poll-ago-Dj148faJ.js.br +0 -0
  36. package/dist/client/assets/pr-queue-columns-Jleg5z3W.js +1 -0
  37. package/dist/client/assets/pr-queue-columns-Jleg5z3W.js.br +0 -0
  38. package/dist/client/assets/radar-panel-Dtp4ZzT3.js +1 -0
  39. package/dist/client/assets/radar-panel-Dtp4ZzT3.js.br +0 -0
  40. package/dist/client/assets/review-queue-panel-BQvU_-xl.js +2 -0
  41. package/dist/client/assets/review-queue-panel-BQvU_-xl.js.br +0 -0
  42. package/dist/client/assets/settings-panel-DegKCsoZ.js +3 -0
  43. package/dist/client/assets/settings-panel-DegKCsoZ.js.br +0 -0
  44. package/dist/client/assets/sprite-bee-DwCVghaj.png +0 -0
  45. package/dist/client/assets/sprite-cat-DRx9MYM3.png +0 -0
  46. package/dist/client/assets/sprite-cow-BX3Phf6B.png +0 -0
  47. package/dist/client/assets/sprite-deer-DwQYMzDV.png +0 -0
  48. package/dist/client/assets/sprite-dragon-CTIHOQJ3.png +0 -0
  49. package/dist/client/assets/sprite-fox-BI43RV3z.png +0 -0
  50. package/dist/client/assets/sprite-frog-CwGTpt-c.png +0 -0
  51. package/dist/client/assets/sprite-giraffe-DwM3MmKG.png +0 -0
  52. package/dist/client/assets/sprite-hamster-WN4q03Wr.png +0 -0
  53. package/dist/client/assets/sprite-hedgehog-CM9XZtPS.png +0 -0
  54. package/dist/client/assets/sprite-horse-B5CMO0Ue.png +0 -0
  55. package/dist/client/assets/sprite-owl-BybpXmvP.png +0 -0
  56. package/dist/client/assets/sprite-panda-DxAHDNb3.png +0 -0
  57. package/dist/client/assets/sprite-penguin-Du588fg8.png +0 -0
  58. package/dist/client/assets/sprite-pig-BTuwvuhq.png +0 -0
  59. package/dist/client/assets/sprite-red-panda-5y9J8xSy.png +0 -0
  60. package/dist/client/assets/sprite-sheep-vHUTjc5U.png +0 -0
  61. package/dist/client/assets/sprite-unicorn-CJ3g8Zet.png +0 -0
  62. package/dist/client/assets/sprite-whale-C3Galw4z.png +0 -0
  63. package/dist/client/assets/trace-panel-DFqImX92.js +1 -0
  64. package/dist/client/assets/trace-panel-DFqImX92.js.br +0 -0
  65. package/dist/client/assets/trail-acacia-5Fr79eBl.png +0 -0
  66. package/dist/client/assets/trail-acacia-frame2-D83GtoaY.png +0 -0
  67. package/dist/client/assets/trail-acacia-frame3-BBXTo5I-.png +0 -0
  68. package/dist/client/assets/trail-acacia-frame4-Xv9ZEsyD.png +0 -0
  69. package/dist/client/assets/trail-acorns-BOCEZemb.png +0 -0
  70. package/dist/client/assets/trail-acorns-frame2-BhHnaBud.png +0 -0
  71. package/dist/client/assets/trail-acorns-frame3-DKXXievy.png +0 -0
  72. package/dist/client/assets/trail-acorns-frame4-Ch2VXeMA.png +0 -0
  73. package/dist/client/assets/trail-bamboo-GqKJxCTV.png +0 -0
  74. package/dist/client/assets/trail-bamboo-frame2-bHacG8f_.png +0 -0
  75. package/dist/client/assets/trail-bamboo-frame3-CaoctCwJ.png +0 -0
  76. package/dist/client/assets/trail-bamboo-frame4-CqBfq3ff.png +0 -0
  77. package/dist/client/assets/trail-bubbles-frame2-eNpysXFZ.png +0 -0
  78. package/dist/client/assets/trail-bubbles-frame3-CWwqOJLM.png +0 -0
  79. package/dist/client/assets/trail-bubbles-frame4-Dj9TUXsV.png +0 -0
  80. package/dist/client/assets/trail-bubbles-pZ5FzCq7.png +0 -0
  81. package/dist/client/assets/trail-clouds-D18nQlSc.png +0 -0
  82. package/dist/client/assets/trail-clouds-frame2-W-_5l_i2.png +0 -0
  83. package/dist/client/assets/trail-clouds-frame3-CGQnOEBI.png +0 -0
  84. package/dist/client/assets/trail-clouds-frame4-CvlkFN6d.png +0 -0
  85. package/dist/client/assets/trail-clover-Ci7hUdO0.png +0 -0
  86. package/dist/client/assets/trail-clover-frame2-Z6NRhQ3U.png +0 -0
  87. package/dist/client/assets/trail-clover-frame3-0srIKU22.png +0 -0
  88. package/dist/client/assets/trail-clover-frame4-BO9UjM_-.png +0 -0
  89. package/dist/client/assets/trail-daisies-DVEPmnHq.png +0 -0
  90. package/dist/client/assets/trail-daisies-frame2-C_3-bnO5.png +0 -0
  91. package/dist/client/assets/trail-daisies-frame3-CR7GzXzm.png +0 -0
  92. package/dist/client/assets/trail-daisies-frame4-CKQDb8cR.png +0 -0
  93. package/dist/client/assets/trail-dust-Cf48D_ja.png +0 -0
  94. package/dist/client/assets/trail-dust-frame2-DAisulyH.png +0 -0
  95. package/dist/client/assets/trail-dust-frame3-BLi-DUzo.png +0 -0
  96. package/dist/client/assets/trail-dust-frame4-DGXo_Q2f.png +0 -0
  97. package/dist/client/assets/trail-embers-c-vlGDDo.png +0 -0
  98. package/dist/client/assets/trail-embers-frame2-wCK1DXpW.png +0 -0
  99. package/dist/client/assets/trail-embers-frame3-C5QS1ZRt.png +0 -0
  100. package/dist/client/assets/trail-embers-frame4-DA-O9bwZ.png +0 -0
  101. package/dist/client/assets/trail-hearts-DQwkXjr0.png +0 -0
  102. package/dist/client/assets/trail-hearts-frame2-DbyTUdl2.png +0 -0
  103. package/dist/client/assets/trail-hearts-frame3-XHaluU_W.png +0 -0
  104. package/dist/client/assets/trail-hearts-frame4-BA0W9inL.png +0 -0
  105. package/dist/client/assets/trail-honey-BC7CvXOJ.png +0 -0
  106. package/dist/client/assets/trail-honey-frame2-C4tRQx2J.png +0 -0
  107. package/dist/client/assets/trail-honey-frame3-V4pdDsZr.png +0 -0
  108. package/dist/client/assets/trail-honey-frame4-BqfUOIZk.png +0 -0
  109. package/dist/client/assets/trail-leaves-Di39skyY.png +0 -0
  110. package/dist/client/assets/trail-leaves-frame2-Dibep-05.png +0 -0
  111. package/dist/client/assets/trail-leaves-frame3-ByxojOFR.png +0 -0
  112. package/dist/client/assets/trail-leaves-frame4-CQGuAWJE.png +0 -0
  113. package/dist/client/assets/trail-logomarks-eIe8WIQx.png +0 -0
  114. package/dist/client/assets/trail-logomarks-frame2-Dw7X4i4F.png +0 -0
  115. package/dist/client/assets/trail-logomarks-frame3-CwoFgR8k.png +0 -0
  116. package/dist/client/assets/trail-logomarks-frame4-B7tFxRZO.png +0 -0
  117. package/dist/client/assets/trail-paws-C4cgGpTt.png +0 -0
  118. package/dist/client/assets/trail-paws-frame2-D8gNCPFb.png +0 -0
  119. package/dist/client/assets/trail-paws-frame3-BiEhbm80.png +0 -0
  120. package/dist/client/assets/trail-paws-frame4-BLLXXSyZ.png +0 -0
  121. package/dist/client/assets/trail-rainbow-BavE03WZ.png +0 -0
  122. package/dist/client/assets/trail-rainbow-frame2-BGZ7ZuQD.png +0 -0
  123. package/dist/client/assets/trail-rainbow-frame3-CY3FOgWe.png +0 -0
  124. package/dist/client/assets/trail-rainbow-frame4-DPWH6W3T.png +0 -0
  125. package/dist/client/assets/trail-seeds-BVCYzFRY.png +0 -0
  126. package/dist/client/assets/trail-seeds-frame2-CgopUUJh.png +0 -0
  127. package/dist/client/assets/trail-seeds-frame3-D2rIJzox.png +0 -0
  128. package/dist/client/assets/trail-seeds-frame4-WbnqCHlJ.png +0 -0
  129. package/dist/client/assets/trail-snow-BmXmGNtx.png +0 -0
  130. package/dist/client/assets/trail-snow-frame2-BQC5GITf.png +0 -0
  131. package/dist/client/assets/trail-snow-frame3-1GIpb4hr.png +0 -0
  132. package/dist/client/assets/trail-snow-frame4-BB4B66p3.png +0 -0
  133. package/dist/client/assets/trail-sparkles-D3Ivb6ob.png +0 -0
  134. package/dist/client/assets/trail-sparkles-frame2-DR03q4T0.png +0 -0
  135. package/dist/client/assets/trail-sparkles-frame3-DtdWWuVM.png +0 -0
  136. package/dist/client/assets/trail-sparkles-frame4-ea8pBjiu.png +0 -0
  137. package/dist/client/assets/trail-stars-EgySiFbH.png +0 -0
  138. package/dist/client/assets/trail-stars-frame2-BOXk5jcm.png +0 -0
  139. package/dist/client/assets/trail-stars-frame3-DJ2AW0RA.png +0 -0
  140. package/dist/client/assets/trail-stars-frame4-BcSJ1AVu.png +0 -0
  141. package/dist/client/assets/ui-prefs-CavQQH-s.js +1 -0
  142. package/dist/client/assets/ui-prefs-CavQQH-s.js.br +0 -0
  143. package/dist/client/assets/usage-panel-CEJqXYIA.js +1 -0
  144. package/dist/client/assets/usage-panel-CEJqXYIA.js.br +0 -0
  145. package/dist/client/assets/visions-panel-Dm3iKlhv.js +1 -0
  146. package/dist/client/assets/visions-panel-Dm3iKlhv.js.br +0 -0
  147. package/dist/client/assets/xterm-BdQ2Kshh.js +79 -0
  148. package/dist/client/assets/xterm-BdQ2Kshh.js.br +0 -0
  149. package/dist/client/assets/zod-BRLv4KqJ.js.br +0 -0
  150. package/dist/client/fonts/CommitMono-OFL.txt.br +0 -0
  151. package/dist/client/fonts/commit-mono-400-regular-core.woff2 +0 -0
  152. package/dist/client/fonts/commit-mono-700-regular-core.woff2 +0 -0
  153. package/dist/client/index.html +7 -3
  154. package/dist/client/index.html.br +0 -0
  155. package/dist/client/octicons-LICENSE.txt.br +3 -0
  156. package/dist/server/index.js +1 -1
  157. package/package.json +1 -1
  158. package/dist/chunks/config-store-DVwdcnub.js +0 -1
  159. package/dist/client/assets/index-BR-wN5UF.js +0 -177
  160. package/dist/client/assets/index-QxVyoSUP.css +0 -2
  161. package/dist/client/assets/xterm-kR64YvZ-.js +0 -79
  162. package/dist/client/fonts/commit-mono-400-italic.woff2 +0 -0
  163. package/dist/client/fonts/commit-mono-700-italic.woff2 +0 -0
@@ -4,9 +4,9 @@ import { a as sanitizeWorktreeName, i as safePathSegment, n as equalsIgnoringCas
4
4
  import { c as resolvePackageBin, i as clientDir, n as bundled, o as packageRoot, r as cliPath, s as relayPath, t as assetRoot } from "./runtime-paths-ghcH9CeW.js";
5
5
  import { $ as MyPrMergeWhenReadyRequest, $t as RESTARTABLE_STATES, A as SESSION_NAME_RULE_TEXT, At as TeamReviewStateEntry, Bt as HEX_SHA_RE, C as ConversationQuestion, Ct as ReviewResult, D as SESSION_DOC_BODY_CAP_BYTES, Et as TeamReviewActionRequest, Ft as canApproveAfterComment, G as MyPrCheckContextsResponse, Gt as repoParts, H as MyPr, Ht as GH_SEGMENT, It as decisionAsIfApprovalRequired, J as MyPrLaneEntry, K as MyPrKeepMergeableRequest, L as SshSignRequest, M as SSH_SIGN_BODY_CAP_BYTES, Mt as TeamReviewThreadCommentsResponse, Nt as TeamReviewThreadResult, Ot as TeamReviewCompareFiles, Pt as TeamReviewThreadsRepository, Q as MyPrMergeStateResponse, Qt as MERGEABLE_LIVE_STATES, Rt as hasStandingViewerApproval, St as ReviewFinding, Tt as ReviewVerdict, U as MyPrAutoRebase, Ut as NODE_ID_RE, V as LinkedPr, Vt as shortSha, W as MyPrCheckContext, Wt as REPO_SLUG_RE, X as MyPrMergeRequest, Xt as BADGE_LABELS, Y as MyPrMergeMethod, Zt as KILLABLE_STATES, _ as CONVERSATION_PERMISSION_HOOK_EVENT, _t as PrDetail, at as MyPrsState, bt as ReviewComment, dt as DECIDING_REVIEW_STATES, en as STATES, ft as EarlierReview, g as CONVERSATION_APPROVAL_SUMMARY_MAX_CHARS, gt as PostingPlan, h as COHERENCE_HOOKS_INACTIVE, ht as GithubReviewState, it as MyPrsSnapshot, j as SIGN_URL_ENV, jt as TeamReviewStatus, k as SESSION_NAME_PATTERN, kt as TeamReviewResolveResponse, n as AGENT_URL_ENV, nt as MyPrThreadNode, pt as FindingSeverity, r as ASK_USER_QUESTION_TOOL_NAME, rt as MyPrThreadsResponse, ut as CommitSha, v as CONVERSATION_TOOL_RESULT_HOOK_EVENT, vt as QueuedReview, wt as ReviewThreadId, xt as ReviewDraft, z as TaskTitle } from "./session-CUc6d7aS.js";
6
6
  import { n as execFileAsync, o as spawn, r as execFileSync, t as execFile } from "./child-process-safe-D4hyVIXj.js";
7
- import { A as BenchmarkStatus, At as GithubIssueResponse, B as comparablePrKey, Ct as PLAN_RESULT_HOOK_EVENT, D as BenchmarkId, Dt as parseExitPlanModeHookPayload, E as BenchmarkCase, Et as PlanRevision, F as PrCheckoutCaseInput, Ft as IssuesStatus, H as WorkflowLabelName, I as GithubPrDetailNode, It as issuePullRequestStateFromGithub, L as GithubPrKey, M as CommitComparison, Mt as IssueUpdate, N as MergedPrListing, Nt as IssuesSearchResponse, O as BenchmarkJudgement, Ot as planTitle, P as MinedPrReviewData, Pt as IssuesState, R as GithubPrLightSearchNode, St as PLAN_HOOK_OUTPUT_MAX_CHARS, T as BenchmarkActionRequest, Tt as PlanDecision, U as WorkflowsSettings, V as WorkflowCommentBody, W as WorkflowsState, Y as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, _ as ClientMessage, _t as CoherenceJournalOutput, a as ConfigUpdate, bt as PLAN_BODY_CAP_BYTES, ft as UpdateJournal, g as CONTROL_FRAME_MAX_BYTES, gt as TraceRecord, ht as TraceCheckpoint, j as BenchmarkSuite, jt as IssueKey, k as BenchmarkRun, kt as GithubIssuePullRequestsRepository, l as configIssueMessage, m as USAGE_VENDOR_KEYS, mt as MAX_RAW_LINE_CHARS, p as USAGE_COST_MODES, pt as SessionSetup, r as BrowserConfig, s as RUNTIME_CONFIG_SCALAR_KEYS, st as USAGE_INTEGER_RANGES, vt as ChangeMap, w as pullRequestKeyFromReference, wt as PLAN_TOOL_NAME, xt as PLAN_HOOK_EVENT, yt as changeMapFactId, z as GithubPrsFrame } from "./config-Dh4e-Mkv.js";
7
+ import { A as BenchmarkId, At as parseExitPlanModeHookPayload, B as GithubPrKey, Ct as PLAN_BODY_CAP_BYTES, D as pullRequestKeyFromReference, Dt as PLAN_TOOL_NAME, Et as PLAN_RESULT_HOOK_EVENT, F as CommitComparison, Ft as IssueUpdate, G as WorkflowLabelName, H as GithubPrsFrame, I as MergedPrListing, It as IssuesSearchResponse, K as WorkflowsSettings, L as MinedPrReviewData, Lt as IssuesState, M as BenchmarkRun, Mt as GithubIssuePullRequestsRepository, N as BenchmarkStatus, Nt as GithubIssueResponse, O as BenchmarkActionRequest, Ot as PlanDecision, P as BenchmarkSuite, Pt as IssueKey, Q as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, R as PrCheckoutCaseInput, Rt as IssuesStatus, St as changeMapFactId, Tt as PLAN_HOOK_OUTPUT_MAX_CHARS, U as comparablePrKey, V as GithubPrLightSearchNode, W as WorkflowCommentBody, _t as MAX_RAW_LINE_CHARS, a as ConfigUpdate, b as ClientMessage, bt as CoherenceJournalOutput, g as CHANGES_POLL_INTERVAL_MS, gt as SessionSetup, ht as UpdateJournal, j as BenchmarkJudgement, jt as planTitle, k as BenchmarkCase, kt as PlanRevision, l as configIssueMessage, m as USAGE_VENDOR_KEYS, p as USAGE_COST_MODES, q as WorkflowsState, r as BrowserConfig, s as RUNTIME_CONFIG_SCALAR_KEYS, ut as USAGE_INTEGER_RANGES, v as CLIENT_LOG_TEXT_MAX_CHARS, vt as TraceCheckpoint, wt as PLAN_HOOK_EVENT, xt as ChangeMap, y as CONTROL_FRAME_MAX_BYTES, yt as TraceRecord, z as GithubPrDetailNode, zt as issuePullRequestStateFromGithub } from "./config-DlKkg6IX.js";
8
8
  import { a as permitsHelpCommand, r as describeSessionLimits } from "./session-routes--hrsvv7a.js";
9
- import { A as seedTaskTitleSources, B as listRepoWorktreePaths, C as extractPromptTaskTitle, D as parseRefinedTaskTitle, E as parseRefinedSessionName, F as resumePromptFor, I as shouldAdoptReportedResumeId, L as claudeProjectsDir, M as RESUME_ID_RE, N as pickAutoResume, O as resolveRefocusTaskTitle, P as resolveResumeTarget, R as encodeProjectDir, S as extractOscTaskTitle, T as isSubstantivePrompt, V as isAutoNameOf, _ as buildTaskTitleRefinementPrompt, a as decideSpawnAllowance, b as decideTaskTitleRefinement, c as describeKeptChildAttention, d as describeUnpushedCloseRefusal, g as buildPersistedTaskTitle, h as projectReviews, i as decideAgentRequest, j as AUTO_CONTINUE_PROMPT, k as resolveTaskTitle, l as describePushLanding, m as projectMyPrs, n as REFUSAL_REASON, o as deriveChildSessionName, p as parseAgentVerb, s as describeChildEndNote, u as describeRoleRefusal, v as chooseRefinedSessionName, w as isSelfWakePrompt, x as extractAiTitle, y as cleanTaskPrompt, z as listRepoConversations } from "./agent-api-core-BCFplxXu.js";
9
+ import { A as seedTaskTitleSources, B as listRepoWorktreePaths, C as extractPromptTaskTitle, D as parseRefinedTaskTitle, E as parseRefinedSessionName, F as resumePromptFor, I as shouldAdoptReportedResumeId, L as claudeProjectsDir, M as RESUME_ID_RE, N as pickAutoResume, O as resolveRefocusTaskTitle, P as resolveResumeTarget, R as encodeProjectDir, S as extractOscTaskTitle, T as isSubstantivePrompt, V as isAutoNameOf, _ as buildTaskTitleRefinementPrompt, a as decideSpawnAllowance, b as decideTaskTitleRefinement, c as describeKeptChildAttention, d as describeUnpushedCloseRefusal, g as buildPersistedTaskTitle, h as projectReviews, i as decideAgentRequest, j as AUTO_CONTINUE_PROMPT, k as resolveTaskTitle, l as describePushLanding, m as projectMyPrs, n as REFUSAL_REASON, o as deriveChildSessionName, p as parseAgentVerb, s as describeChildEndNote, u as describeRoleRefusal, v as chooseRefinedSessionName, w as isSelfWakePrompt, x as extractAiTitle, y as cleanTaskPrompt, z as listRepoConversations } from "./agent-api-core-DQwd2ClI.js";
10
10
  import { a as positiveIntOr, c as textOr, i as numberOr, n as isRecord, o as positiveNumberOr, r as nonNegativeIntOr, s as rawTextOr, t as coercedNumberOr } from "./coerce-NSst8oRP.js";
11
11
  import { n as glimmervoidHomeDir, t as decideConfigPath } from "./config-path-core-DFt-TemS.js";
12
12
  import { i as parseCommandLine, n as warnWhenGitIsTooOld } from "./git-version-C3lznLS_.js";
@@ -21,13 +21,13 @@ import { n as DEFAULT_MAX_MS, r as nextBackoffMs, t as DEFAULT_BASE_MS } from ".
21
21
  import { n as unrefTimer, t as DEFAULT_TIMER_FNS } from "./timer-deps-u2DAQLok.js";
22
22
  import { n as shellQuote } from "./hook-command-core-qTNK-xMF.js";
23
23
  import { C as parseCgroupBytes, S as memoryReserveBytes, T as parseMemAvailableBytes, _ as createSpawnGate, a as jsonStateLoadError, b as cgroupLimitBytes, c as loadedJsonValue, d as writeJsonAtomicSync, f as writeTextAtomic, g as createSerialQueue, h as createMemoryAdmission, i as createJsonStateWriter, m as createKeyedSerialQueue, n as appendJsonLines, o as loadJsonStateFile, p as writeTextAtomicSync, r as createJsonStateStore, s as loadJsonStateFileSync, t as appendJsonLine, u as writeJsonAtomic, v as isQueueAdmissionTimeout, w as parseCgroupV2Path, x as headroomFromReadings, y as cgroupAncestorPaths } from "./json-file-DFCTvPjj.js";
24
- import { B as buildExceptionProperties, F as TELEMETRY_BATCH_URL, G as decideIsDevInstall, H as classifySessionExit, I as TELEMETRY_FLAGS_URL, J as exceptionFingerprint, K as decideRemoteTelemetryState, L as adapterBucket, P as FIRST_RUN_NOTICE, R as buildAiGenerationEvents, U as claudeAccountUuidOf, V as buildPersonProperties, W as codexUserIdOf, X as parsePosthogReleaseId, Y as nodeMajorVersion, Z as resolveProjectToken, a as generateProjectId, at as planWorktreeGc, b as validateSettingsBlock, ct as worktreeIntegrationTips, d as assetForPlatform, dt as isSameDirectoryPath, et as stableConfigKey, f as decideRtkInstall, g as verifyDigest, h as isRtkBinaryName, i as ensureProjectIds, it as planBranchGc, lt as canonicalizePath, m as installTargetPath, n as DEFAULT_CONFIG, nt as DEFAULT_BRANCH_GC_PREFIXES, o as glimmervoidHomeDir$1, ot as sessionIdFromBranch, p as findEscapingArchiveMember, q as decideTelemetryConsent, r as createConfigStore, rt as matchedPrefix, st as usablePrefixes, t as ABORT_CONFIG_SAVE, ut as comparableDirectoryPath, v as mergeSettingsBlock, y as settingsBlockSpecFor, z as buildBrowserExceptionProperties } from "./config-store-CEsetno2.js";
25
- import { a as parseDataClientMessage, c as PendingCrashReport, d as TelemetryState, i as parseDataAttachHistory, l as TELEMETRY_EVENT_SCHEMAS, n as HookEnvelope, o as DashboardTelemetryReport, r as DEEP_HISTORY_SCROLLBACK_LINES, t as HTTP_URL_RE } from "./contracts-dj-GFptp.js";
26
- import { A as dedupeCodexFiles, B as shouldPersistWarehouse, C as shortSha$1, D as codexSessionIdFromPath, E as codexRootCandidates, F as passOutcome, H as claudeCode, I as projectDirCandidates, L as resolveProjectsDirs, M as grokHomes, N as grokRootCandidates, O as continuationDelayMs, P as isUsageFile, R as scopedClaudeRoots, S as parseResolvedSha, T as codexHomes, V as splitLines$1, _ as isCheckFresh, a as describeAgentResolvability, b as parseRegistryDeprecation, c as isKnownAgentId, d as resolveAdapter, f as setCustomAgents, g as decideUpdateStatus, h as decideInstallFlavor, i as customAgentFingerprint, j as expandTilde, k as decideFileRead, l as listAgentIds, m as readHostCodexVersion, n as cachedAgentResolvability, o as getAdapter, p as codex, r as commandFor, s as hookProfileOf, t as DEFAULT_AGENT_ID, u as resetCommandCache, v as normalizeSha, w as codexFallbackRoots, x as parseRegistryLatest, y as normalizeUpdateChannel, z as shouldEvaluateDespiteIoFailures } from "./adapters-BsoXEvlZ.js";
24
+ import { B as buildExceptionProperties, F as TELEMETRY_BATCH_URL, G as decideIsDevInstall, H as classifySessionExit, I as TELEMETRY_FLAGS_URL, J as exceptionFingerprint, K as decideRemoteTelemetryState, L as adapterBucket, P as FIRST_RUN_NOTICE, R as buildAiGenerationEvents, U as claudeAccountUuidOf, V as buildPersonProperties, W as codexUserIdOf, X as parsePosthogReleaseId, Y as nodeMajorVersion, Z as resolveProjectToken, a as generateProjectId, at as planWorktreeGc, b as validateSettingsBlock, ct as worktreeIntegrationTips, d as assetForPlatform, dt as isSameDirectoryPath, et as stableConfigKey, f as decideRtkInstall, g as verifyDigest, h as isRtkBinaryName, i as ensureProjectIds, it as planBranchGc, lt as canonicalizePath, m as installTargetPath, n as DEFAULT_CONFIG, nt as DEFAULT_BRANCH_GC_PREFIXES, o as glimmervoidHomeDir$1, ot as sessionIdFromBranch, p as findEscapingArchiveMember, q as decideTelemetryConsent, r as createConfigStore, rt as matchedPrefix, st as usablePrefixes, t as ABORT_CONFIG_SAVE, ut as comparableDirectoryPath, v as mergeSettingsBlock, y as settingsBlockSpecFor, z as buildBrowserExceptionProperties } from "./config-store-DIrwF5iQ.js";
25
+ import { a as parseDataClientMessage, c as PendingCrashReport, d as TelemetryState, i as parseDataAttach, l as TELEMETRY_EVENT_SCHEMAS, n as HookEnvelope, o as DashboardTelemetryReport, r as DEEP_HISTORY_SCROLLBACK_LINES, t as HTTP_URL_RE } from "./contracts-lxJ0sQEl.js";
26
+ import { A as dedupeCodexFiles, B as shouldPersistWarehouse, C as shortSha$1, D as codexSessionIdFromPath, E as codexRootCandidates, F as passOutcome, H as claudeCode, I as projectDirCandidates, L as resolveProjectsDirs, M as grokHomes, N as grokRootCandidates, O as continuationDelayMs, P as isUsageFile, R as scopedClaudeRoots, S as parseResolvedSha, T as codexHomes, V as splitLines$1, _ as isCheckFresh, a as describeAgentResolvability, b as parseRegistryDeprecation, c as isKnownAgentId, d as resolveAdapter, f as setCustomAgents, g as decideUpdateStatus, h as decideInstallFlavor, i as customAgentFingerprint, j as expandTilde, k as decideFileRead, l as listAgentIds, m as readHostCodexVersion, n as cachedAgentResolvability, o as getAdapter, p as codex, r as commandFor, s as hookProfileOf, t as DEFAULT_AGENT_ID, u as resetCommandCache, v as normalizeSha, w as codexFallbackRoots, x as parseRegistryLatest, y as normalizeUpdateChannel, z as shouldEvaluateDespiteIoFailures } from "./adapters-7AfJ6yb3.js";
27
27
  import { t as HOOK_TOOLS } from "./hook-tools-Dl7-r2Eb.js";
28
28
  import { a as formatSshPublicKey, c as orderAgentSockets, i as commitSigningShimText, l as parseSshPublicKey, n as NO_AGENT_HOLDS_KEY, o as isForwardedAgentDirName, r as agentListsKey, s as isSignableGitObject, t as COMMIT_SIGNING_SHIM_NAME } from "./ssh-signing-core-CRhVVWNW.js";
29
- import { a as configSiblingPath, c as defaultPairingsPath, d as decideDeviceAuth, f as deviceNameFromUserAgent, l as defaultSeenPath, n as normalizeRemoteConfig, o as createPairingsStore, p as hashSecret, r as validateRemoteConfig, s as createSeenStore, t as decideBindHost, u as DEFAULT_DEVICE_MAX_AGE_MS } from "./remote-config-CtcoO10O.js";
30
- import { n as configFileViewOf, u as readSettingsForAgent } from "./settings-readout-core-BVb6tTLq.js";
29
+ import { a as configSiblingPath, c as defaultPairingsPath, d as decideDeviceAuth, f as deviceNameFromUserAgent, l as defaultSeenPath, n as normalizeRemoteConfig, o as createPairingsStore, p as hashSecret, r as validateRemoteConfig, s as createSeenStore, t as decideBindHost, u as DEFAULT_DEVICE_MAX_AGE_MS } from "./remote-config-C91HwjWq.js";
30
+ import { n as configFileViewOf, u as readSettingsForAgent } from "./settings-readout-core-DK1m5TUq.js";
31
31
  import { _ as escapeMarkup, g as createLaneLog, n as createVisionsSetup } from "./visions-setup-VMMyqOpl.js";
32
32
  import { t as getRtkPath } from "./rtk-resolver-BDHi6RMv.js";
33
33
  import { createRequire } from "node:module";
@@ -2153,11 +2153,71 @@ function createBackendHttpApp(dependencies) {
2153
2153
  mountCustomSoundRoutes(app, { soundsDir: customSoundsDir });
2154
2154
  if (staticDir === "auto") {
2155
2155
  if (!fs.existsSync(path.join(clientDir, "index.html"))) throw Object.assign(/* @__PURE__ */ new Error("Dashboard build not found (dist/client). Run `npm run build` first, or use `npm run dev`."), { glimmervoidBoot: true });
2156
- app.use(express.static(clientDir));
2156
+ serveClientDir(app, clientDir);
2157
2157
  }
2158
- if (staticDir !== "auto" && typeof staticDir === "string") app.use(express.static(staticDir));
2158
+ if (staticDir !== "auto" && typeof staticDir === "string") serveClientDir(app, staticDir);
2159
2159
  return app;
2160
2160
  }
2161
+ var HASHED_ASSET_PREFIX = "/assets/";
2162
+ var ONE_YEAR_MS = 31536e6;
2163
+ function isHashedAssetPath(requestPath) {
2164
+ return requestPath.startsWith(HASHED_ASSET_PREFIX);
2165
+ }
2166
+ function acceptsBrotli(acceptEncoding) {
2167
+ return (Array.isArray(acceptEncoding) ? acceptEncoding.join(",") : acceptEncoding ?? "").split(",").some((entry) => {
2168
+ const [coding = "", ...parameters] = entry.trim().toLowerCase().split(";");
2169
+ if (coding.trim() !== "br") return false;
2170
+ const quality = parameters.map((parameter) => parameter.trim()).find((parameter) => parameter.startsWith("q="));
2171
+ return quality === void 0 || Number(quality.slice(2)) > 0;
2172
+ });
2173
+ }
2174
+ function resolveClientFile(rootDir, requestPath) {
2175
+ let decodedPath;
2176
+ try {
2177
+ decodedPath = decodeURIComponent(requestPath);
2178
+ } catch {
2179
+ return null;
2180
+ }
2181
+ if (decodedPath.includes("\0")) return null;
2182
+ const relativePath = decodedPath.endsWith("/") ? `${decodedPath}index.html` : decodedPath;
2183
+ const filePath = path.resolve(rootDir, `.${relativePath}`);
2184
+ if (!filePath.startsWith(path.resolve(rootDir) + path.sep)) return null;
2185
+ return filePath;
2186
+ }
2187
+ function createPrecompressedStatic(rootDir) {
2188
+ return (req, res, next) => {
2189
+ if (req.method !== "GET" && req.method !== "HEAD") return next();
2190
+ const filePath = resolveClientFile(rootDir, req.path);
2191
+ if (!filePath) return next();
2192
+ const compressedPath = `${filePath}.br`;
2193
+ fs$1.stat(compressedPath).then((compressedStat) => {
2194
+ if (!compressedStat.isFile()) return next();
2195
+ res.setHeader("Vary", "Accept-Encoding");
2196
+ if (!acceptsBrotli(req.headers["accept-encoding"])) return next();
2197
+ res.type(path.extname(filePath));
2198
+ res.setHeader("Content-Encoding", "br");
2199
+ const cacheOptions = isHashedAssetPath(req.path) ? {
2200
+ maxAge: ONE_YEAR_MS,
2201
+ immutable: true
2202
+ } : {};
2203
+ res.sendFile(path.relative(rootDir, compressedPath), {
2204
+ root: rootDir,
2205
+ ...cacheOptions
2206
+ }, (error) => {
2207
+ if (!error || res.headersSent) return;
2208
+ res.removeHeader("Content-Encoding");
2209
+ next();
2210
+ });
2211
+ }).catch(() => next());
2212
+ };
2213
+ }
2214
+ function serveClientDir(app, rootDir) {
2215
+ app.use(createPrecompressedStatic(rootDir));
2216
+ app.use(express.static(rootDir, { setHeaders: (res, filePath) => {
2217
+ if (!filePath.startsWith(path.join(path.resolve(rootDir), "assets") + path.sep)) return;
2218
+ res.setHeader("Cache-Control", `public, max-age=${ONE_YEAR_MS / 1e3}, immutable`);
2219
+ } }));
2220
+ }
2161
2221
  //#endregion
2162
2222
  //#region server/host-url-opener.ts
2163
2223
  var OPENER_EXIT_WINDOW_MS = 2e3;
@@ -5019,7 +5079,10 @@ function createWsSender(ws, opts = {}) {
5019
5079
  let sentOffset = initialOffset;
5020
5080
  let desynced = false;
5021
5081
  let refusedOutOfBand = null;
5022
- let isOutputPaused = false;
5082
+ let isOutputPaused = opts.isStartedPaused === true;
5083
+ let isScreenSnapshotOwed = opts.isStartedPaused === true;
5084
+ let heldAttachSnapshot = opts.heldAttachSnapshot ?? null;
5085
+ const onPausedData = opts.onPausedData ?? (() => {});
5023
5086
  const bufferedAmount = () => ws.bufferedAmount || 0;
5024
5087
  const isOpen = () => ws.readyState === OPEN;
5025
5088
  const overHighWater = () => bufferedAmount() > cfg.highWaterMark;
@@ -5084,7 +5147,11 @@ function createWsSender(ws, opts = {}) {
5084
5147
  scheduleImmediate(flushSend);
5085
5148
  }
5086
5149
  function onData(data) {
5087
- if (destroyed || isOutputPaused || !isOpen()) return;
5150
+ if (destroyed || !isOpen()) return;
5151
+ if (isOutputPaused) {
5152
+ onPausedData();
5153
+ return;
5154
+ }
5088
5155
  if (desynced && !overHighWater()) {
5089
5156
  maybeBackfill();
5090
5157
  return;
@@ -5131,6 +5198,12 @@ function createWsSender(ws, opts = {}) {
5131
5198
  ws.send(payload);
5132
5199
  return true;
5133
5200
  }
5201
+ function sendDroppable(payload) {
5202
+ if (destroyed || !isOpen()) return false;
5203
+ if (refusedOutOfBand !== null || desynced || sendBuffer.length > 0 || overHighWater()) return false;
5204
+ ws.send(payload);
5205
+ return true;
5206
+ }
5134
5207
  function pauseOutput() {
5135
5208
  if (destroyed || isOutputPaused) return;
5136
5209
  flushSend();
@@ -5153,6 +5226,20 @@ function createWsSender(ws, opts = {}) {
5153
5226
  if (destroyed || !isOutputPaused) return;
5154
5227
  isOutputPaused = false;
5155
5228
  if (!source || !isOpen()) return;
5229
+ if (isScreenSnapshotOwed) {
5230
+ isScreenSnapshotOwed = false;
5231
+ const attachSnapshot = heldAttachSnapshot;
5232
+ heldAttachSnapshot = null;
5233
+ if (!(attachSnapshot !== null && !hasResizedWhilePaused && outputOffset - attachSnapshot.offset <= cfg.maxSendBuffer)) {
5234
+ resetToScreenSnapshot(readScreenSnapshot());
5235
+ return;
5236
+ }
5237
+ resetToScreenSnapshot(attachSnapshot);
5238
+ if (outputOffset <= sentOffset) return;
5239
+ desynced = true;
5240
+ maybeBackfill();
5241
+ return;
5242
+ }
5156
5243
  const missedByteCount = outputOffset - sentOffset;
5157
5244
  if (missedByteCount <= 0 && !desynced) return;
5158
5245
  if (!hasResizedWhilePaused && missedByteCount <= cfg.maxSendBuffer) {
@@ -5166,6 +5253,7 @@ function createWsSender(ws, opts = {}) {
5166
5253
  destroyed = true;
5167
5254
  clearStall();
5168
5255
  refusedOutOfBand = null;
5256
+ heldAttachSnapshot = null;
5169
5257
  sendBuffer = "";
5170
5258
  sendScheduled = false;
5171
5259
  flushNextData = false;
@@ -5177,6 +5265,7 @@ function createWsSender(ws, opts = {}) {
5177
5265
  markInputFlush,
5178
5266
  sendImmediate,
5179
5267
  sendOutOfBand,
5268
+ sendDroppable,
5180
5269
  destroy
5181
5270
  };
5182
5271
  }
@@ -5207,6 +5296,7 @@ function sendPtySizeFrame(sender, size) {
5207
5296
  };
5208
5297
  sender.sendOutOfBand(Buffer.from(JSON.stringify(frame), "utf8"));
5209
5298
  }
5299
+ var OUTPUT_BEAT_FRAME = Buffer.from(JSON.stringify({ type: "output-beat" }), "utf8");
5210
5300
  function frameType(stamped) {
5211
5301
  return typeof stamped.type === "string" ? stamped.type : "";
5212
5302
  }
@@ -5214,11 +5304,13 @@ function createBackendWebSockets(dependencies) {
5214
5304
  const { remote, remoteAuth, remoteListenerPort, allowedHosts, listenerPortsFor, tokenMatches, getSession, getVisionsLane, recordOutcome = () => {}, logger } = dependencies;
5215
5305
  const controlWss = new WebSocketServer({
5216
5306
  noServer: true,
5217
- maxPayload: CONTROL_FRAME_MAX_BYTES
5307
+ maxPayload: CONTROL_FRAME_MAX_BYTES,
5308
+ perMessageDeflate: true
5218
5309
  });
5219
5310
  const dataWss = new WebSocketServer({
5220
5311
  noServer: true,
5221
- maxPayload: 2097152
5312
+ maxPayload: 2097152,
5313
+ perMessageDeflate: true
5222
5314
  });
5223
5315
  controlWss.on("connection", (socket) => {
5224
5316
  recordOutcome("controlWsOpened");
@@ -5264,8 +5356,12 @@ function createBackendWebSockets(dependencies) {
5264
5356
  return;
5265
5357
  }
5266
5358
  socket.on("error", (error) => reportDataSocketError(session, error));
5267
- if (parseDataAttachHistory(request.url) === "screen") {
5268
- wireDataSocket(socket, session, sessionId, session.getScreenSnapshot());
5359
+ const attach = parseDataAttach(request.url);
5360
+ if (attach.history === "screen") {
5361
+ wireDataSocket(socket, session, sessionId, session.getScreenSnapshot(), {
5362
+ isAttachedPaused: attach.isOutputPaused,
5363
+ isDeepAttach: false
5364
+ });
5269
5365
  return;
5270
5366
  }
5271
5367
  const messagesBeforeWiring = [];
@@ -5280,7 +5376,10 @@ function createBackendWebSockets(dependencies) {
5280
5376
  socket.close(1008, "Session not found");
5281
5377
  return;
5282
5378
  }
5283
- wireDataSocket(socket, session, sessionId, snapshot);
5379
+ wireDataSocket(socket, session, sessionId, snapshot, {
5380
+ isAttachedPaused: attach.isOutputPaused,
5381
+ isDeepAttach: true
5382
+ });
5284
5383
  for (const raw of messagesBeforeWiring) socket.emit("message", raw, false);
5285
5384
  }, (error) => {
5286
5385
  logger.warn(`[data-ws] Deep history failed for ${session.name}: ${String(error)}`);
@@ -5299,7 +5398,7 @@ function createBackendWebSockets(dependencies) {
5299
5398
  timestamp: Date.now()
5300
5399
  });
5301
5400
  }
5302
- function wireDataSocket(socket, session, sessionId, snapshot) {
5401
+ function wireDataSocket(socket, session, sessionId, snapshot, { isAttachedPaused, isDeepAttach }) {
5303
5402
  let viewerSizes = sessionDataClients.get(sessionId);
5304
5403
  if (!viewerSizes) {
5305
5404
  viewerSizes = /* @__PURE__ */ new Map();
@@ -5323,17 +5422,27 @@ function createBackendWebSockets(dependencies) {
5323
5422
  if (sessionDataClients.get(activeSessionId) !== viewerSizeMap) return;
5324
5423
  applyResolvedSize(true);
5325
5424
  };
5425
+ let lastOutputBeatAt = 0;
5426
+ const sendOutputBeat = () => {
5427
+ const now = Date.now();
5428
+ if (now - lastOutputBeatAt < 320) return;
5429
+ lastOutputBeatAt = now;
5430
+ sender.sendDroppable(OUTPUT_BEAT_FRAME);
5431
+ };
5326
5432
  const sender = createWsSender(socket, {
5327
5433
  source: { getBufferSince: (offset) => session.getBufferSince(offset) },
5328
- startOffset: snapshot.offset
5434
+ startOffset: snapshot.offset,
5435
+ isStartedPaused: isAttachedPaused,
5436
+ heldAttachSnapshot: isAttachedPaused && isDeepAttach ? snapshot : null,
5437
+ onPausedData: sendOutputBeat
5329
5438
  });
5330
5439
  sendPtySizeFrame(sender, session.ptySize());
5331
- if (snapshot.data) sender.sendImmediate(snapshot.data, 0);
5440
+ if (snapshot.data && !isAttachedPaused) sender.sendImmediate(snapshot.data, 0);
5332
5441
  const dataListener = (data) => sender.onData(data);
5333
5442
  session.on("data", dataListener);
5334
5443
  const resizeListener = (size) => sendPtySizeFrame(sender, size);
5335
5444
  session.on("resize", resizeListener);
5336
- let resizeSeqAtPause = null;
5445
+ let resizeSeqAtPause = isAttachedPaused ? session.ptySize().seq : null;
5337
5446
  socket.on("message", (raw) => {
5338
5447
  const message = parseDataClientMessage(String(raw));
5339
5448
  if (!message) return;
@@ -50997,6 +51106,81 @@ function createChangeMapService({ sessions, runGit = runGitAsync, nowFn = Date.n
50997
51106
  return { build };
50998
51107
  }
50999
51108
  //#endregion
51109
+ //#region server/core/changes-watch-core.ts
51110
+ function decideWatchRequest(current, request) {
51111
+ if (request.sessionId === null) return {
51112
+ next: current !== null && current.holder === request.holder ? null : current,
51113
+ shouldCheckNow: false
51114
+ };
51115
+ const isRenewal = current !== null && current.holder === request.holder && current.sessionId === request.sessionId;
51116
+ return {
51117
+ next: {
51118
+ holder: request.holder,
51119
+ sessionId: request.sessionId,
51120
+ renewedAtMs: request.nowMs
51121
+ },
51122
+ shouldCheckNow: !isRenewal
51123
+ };
51124
+ }
51125
+ function decidePollTick(current, tick) {
51126
+ if (current === null) return {
51127
+ next: null,
51128
+ sessionIdToCheck: null
51129
+ };
51130
+ if (tick.nowMs - current.renewedAtMs > 1e4 || !tick.isHolderOpen) return {
51131
+ next: null,
51132
+ sessionIdToCheck: null
51133
+ };
51134
+ return {
51135
+ next: current,
51136
+ sessionIdToCheck: current.sessionId
51137
+ };
51138
+ }
51139
+ //#endregion
51140
+ //#region server/changes-watch.ts
51141
+ function createChangesWatch({ findSession, isHolderOpen, setIntervalFn = DEFAULT_TIMER_FNS.setIntervalFn, clearIntervalFn = DEFAULT_TIMER_FNS.clearIntervalFn, nowFn = Date.now }) {
51142
+ let watch = null;
51143
+ let pollTimer = null;
51144
+ function syncPollTimer() {
51145
+ if (watch === null && pollTimer !== null) {
51146
+ clearIntervalFn(pollTimer);
51147
+ pollTimer = null;
51148
+ return;
51149
+ }
51150
+ if (watch === null || pollTimer !== null) return;
51151
+ pollTimer = unrefTimer(setIntervalFn(pollWatchedSession, CHANGES_POLL_INTERVAL_MS));
51152
+ }
51153
+ function checkSession(sessionId) {
51154
+ const session = findSession(sessionId);
51155
+ if (session) {
51156
+ session.worktreeLifecycle.scheduleCheck();
51157
+ return;
51158
+ }
51159
+ watch = null;
51160
+ }
51161
+ function pollWatchedSession() {
51162
+ const holderIsOpen = watch !== null && isHolderOpen(watch.holder);
51163
+ const tick = decidePollTick(watch, {
51164
+ nowMs: nowFn(),
51165
+ isHolderOpen: holderIsOpen
51166
+ });
51167
+ watch = tick.next;
51168
+ if (tick.sessionIdToCheck !== null) checkSession(tick.sessionIdToCheck);
51169
+ syncPollTimer();
51170
+ }
51171
+ function request(holder, sessionId) {
51172
+ const decision = decideWatchRequest(watch, {
51173
+ holder,
51174
+ sessionId,
51175
+ nowMs: nowFn()
51176
+ });
51177
+ watch = decision.next;
51178
+ if (decision.shouldCheckNow && watch !== null) checkSession(watch.sessionId);
51179
+ syncPollTimer();
51180
+ }
51181
+ return { request };
51182
+ }
51183
+ //#endregion
51000
51184
  //#region server/control-handlers.ts
51001
51185
  function isInsideGitCheckout(folderPath) {
51002
51186
  const resolvedFolder = path.resolve(folderPath);
@@ -51363,6 +51547,10 @@ function registerControlHandlers(controlWss, deps) {
51363
51547
  }
51364
51548
  }), issueProjectRepos = null, serverBuild = () => null, getUsageSessions = null, getUsageReport = null, requestUsageReport = null, getPlanLimits = null, controlReplayLog = null, getRtkInstallStatus = () => null, telegramDelivery = null, resolveRtkPath = () => getRtkPath(), conversationFs = fs, conversationGit = runGitForConversationHistory, conversationProjectsDir = claudeProjectsDir(process.env, os.homedir()), readTracePage = null, readPlanRevision = null, decidePlanReview = null, sessionDocs = null, coherenceFeed = null, coderEnv = null, remoteRepoGit = null, agentConnect = null, remoteSetup = null } = deps;
51365
51549
  const changeMaps = createChangeMapService({ sessions });
51550
+ const changesWatch = createChangesWatch({
51551
+ findSession: (id) => sessions.get(id) ?? agentSessions.get(id) ?? null,
51552
+ isHolderOpen: (ws) => ws.readyState === 1
51553
+ });
51366
51554
  function buildSettingsPayload$1() {
51367
51555
  return buildSettingsPayload({
51368
51556
  configStore,
@@ -52967,6 +53155,7 @@ function registerControlHandlers(controlWss, deps) {
52967
53155
  }));
52968
53156
  }
52969
53157
  },
53158
+ "watch-session-changes": (msg, ws) => changesWatch.request(ws, msg.id),
52970
53159
  "request-change-map": async (msg, ws) => {
52971
53160
  const s = findSession(msg);
52972
53161
  if (!s) return;
@@ -53291,6 +53480,9 @@ function registerControlHandlers(controlWss, deps) {
53291
53480
  stack: msg.stack
53292
53481
  });
53293
53482
  },
53483
+ "client-log": (msg) => {
53484
+ console.warn(`[dashboard] ${sanitizeOneLine(msg.scope, 64)}: ${sanitizeOneLine(msg.text, CLIENT_LOG_TEXT_MAX_CHARS)}`);
53485
+ },
53294
53486
  "dashboard-telemetry": captureDashboardTelemetry,
53295
53487
  "request-telemetry-deletion": async (msg, ws) => {
53296
53488
  const ok = await deps.telemetry?.requestDataDeletion?.() ?? false;
@@ -1,6 +1,6 @@
1
1
  import { r as errorMessage } from "./text-DoirglWV.js";
2
- import { c as resolveConfigPath } from "./config-store-CEsetno2.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-CtcoO10O.js";
2
+ import { c as resolveConfigPath } from "./config-store-DIrwF5iQ.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-C91HwjWq.js";
4
4
  import fs from "node:fs";
5
5
  //#region server/text-format.ts
6
6
  function trimIso(iso) {
@@ -3,7 +3,7 @@ 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
5
  import { a as jsonStateLoadError, d as writeJsonAtomicSync, l as sleepSync, s as loadJsonStateFileSync, u as writeJsonAtomic } from "./json-file-DFCTvPjj.js";
6
- import { lt as canonicalizePath, o as glimmervoidHomeDir } from "./config-store-CEsetno2.js";
6
+ import { lt as canonicalizePath, o as glimmervoidHomeDir } from "./config-store-DIrwF5iQ.js";
7
7
  import fs from "node:fs";
8
8
  import path from "node:path";
9
9
  import crypto from "node:crypto";
@@ -1,11 +1,11 @@
1
1
  import { r as errorMessage, t as errorCode } from "./text-DoirglWV.js";
2
2
  import { f as AgentSettingsReply } from "./session-CUc6d7aS.js";
3
- import { r as BrowserConfig } from "./config-Dh4e-Mkv.js";
3
+ import { r as BrowserConfig } from "./config-DlKkg6IX.js";
4
4
  import { n as isRecord } from "./coerce-NSst8oRP.js";
5
5
  import { t as renderTable } from "./ascii-figure-core-pDAwtlKO.js";
6
6
  import { n as glimmervoidHomeDir, t as decideConfigPath } from "./config-path-core-DFt-TemS.js";
7
- import { $ as readEnvSecrets, C as deleteValueAtPath, D as scoreSettingsSearch, E as parsePosthogProjectSelection, N as SETTINGS_REGISTRY, O as setValueAtPath, Q as ENV_SECRET_BINDINGS, S as cloneValue, j as valueAtPath, l as saveConfigFileOnce, s as loadConfigFile, tt as withEnvSecrets, u as validateConfig } from "./config-store-CEsetno2.js";
8
- import { a as fail, c as listSettings, d as renderSectionTables, f as requireConfigFileSetting, g as valueText, h as succeed, i as describeSetting, l as readSetting, m as settingsRequestForServer, n as configFileViewOf, o as fitColumn, p as sectionOf, r as defaultText, s as getSetting, t as ALL_SETTINGS } from "./settings-readout-core-BVb6tTLq.js";
7
+ import { $ as readEnvSecrets, C as deleteValueAtPath, D as scoreSettingsSearch, E as parsePosthogProjectSelection, N as SETTINGS_REGISTRY, O as setValueAtPath, Q as ENV_SECRET_BINDINGS, S as cloneValue, j as valueAtPath, l as saveConfigFileOnce, s as loadConfigFile, tt as withEnvSecrets, u as validateConfig } from "./config-store-DIrwF5iQ.js";
8
+ import { a as fail, c as listSettings, d as renderSectionTables, f as requireConfigFileSetting, g as valueText, h as succeed, i as describeSetting, l as readSetting, m as settingsRequestForServer, n as configFileViewOf, o as fitColumn, p as sectionOf, r as defaultText, s as getSetting, t as ALL_SETTINGS } from "./settings-readout-core-DK1m5TUq.js";
9
9
  import fs from "node:fs";
10
10
  import os from "node:os";
11
11
  import { parseArgs } from "node:util";
@@ -329,7 +329,7 @@ function processIo() {
329
329
  async function runSettingsCli(commandArguments, io = processIo()) {
330
330
  const serverRequest = settingsRequestForServer(commandArguments, process.env);
331
331
  if (!serverRequest) return runSettingsCommand(commandArguments, io);
332
- const { askAgentApi } = await import("./agent-api-cli-B-QxkZAQ.js");
332
+ const { askAgentApi } = await import("./agent-api-cli-prUJ5ZGN.js");
333
333
  const reply = AgentSettingsReply.safeParse(await askAgentApi("settings", serverRequest).catch((error) => ({
334
334
  ok: false,
335
335
  error: errorMessage(error)
@@ -1,6 +1,6 @@
1
1
  import { p as AgentSettingsRequest } from "./session-CUc6d7aS.js";
2
2
  import { t as renderTable } from "./ascii-figure-core-pDAwtlKO.js";
3
- import { $ as readEnvSecrets, A as settingsOf, M as FILE_ONLY_GROUPS, N as SETTINGS_REGISTRY, S as cloneValue, T as hasScaledUnit, j as valueAtPath, k as settingsGroupOf, w as displayText, x as SETTINGS_INDEX } from "./config-store-CEsetno2.js";
3
+ import { $ as readEnvSecrets, A as settingsOf, M as FILE_ONLY_GROUPS, N as SETTINGS_REGISTRY, S as cloneValue, T as hasScaledUnit, j as valueAtPath, k as settingsGroupOf, w as displayText, x as SETTINGS_INDEX } from "./config-store-DIrwF5iQ.js";
4
4
  import { parseArgs } from "node:util";
5
5
  //#region server/core/settings-readout-core.ts
6
6
  var VALUE_COLUMN_WIDTH = 40;
@@ -2,7 +2,7 @@ import { r as errorMessage } from "./text-DoirglWV.js";
2
2
  import { I as SshSignReply, j as SIGN_URL_ENV } from "./session-CUc6d7aS.js";
3
3
  import { n as execFileAsync, o as spawn } from "./child-process-safe-D4hyVIXj.js";
4
4
  import { a as isLoopbackHostname } from "./hook-relay-core-DA_bz2KA.js";
5
- import { n as postToAgentIngress } from "./agent-api-cli-DIl92JjQ.js";
5
+ import { n as postToAgentIngress } from "./agent-api-cli-zwuWZlwk.js";
6
6
  import { l as parseSshPublicKey } from "./ssh-signing-core-CRhVVWNW.js";
7
7
  import path from "node:path";
8
8
  import fs from "node:fs/promises";
@@ -0,0 +1 @@
1
+ import{A as e,Ct as t,D as n,E as r,Et as i,b as a,o}from"./dom-helpers-CcEFPh-F.js";var s=`http://www.w3.org/2000/svg`;function c(e,t){let n=document.createElementNS(s,e);for(let[e,r]of Object.entries(t))n.setAttribute(e,r);return n}function l(e,t){let n=document.createElementNS(s,`svg`);return n.setAttribute(`width`,String(e)),n.setAttribute(`height`,String(t)),n.setAttribute(`viewBox`,`0 0 ${e} ${t}`),n.setAttribute(`aria-hidden`,`true`),n}var u=`M4 4L12 12M12 4L4 12`,d=`M12 8a4 4 0 1 1-8 0a4 4 0 1 1 8 0M8 1.5v2.5M8 12v2.5M1.5 8h2.5M12 8h2.5M3.4 3.4l1.77 1.77M10.83 10.83l1.77 1.77M3.4 12.6l1.77-1.77M10.83 5.17l1.77-1.77`,f=`M3 4h10M3 8h10M3 12h10`,p=`M3 8h0.01M8 8h0.01M13 8h0.01`,m=`M8 2.5v6M5 5.5h6M5 12.5h6`,h=`M4.5 12.5h7a3 3 0 0 0 0.4-5.97a4 4 0 0 0-7.7 0.57a2.7 2.7 0 0 0 0.3 5.4z`;function g(e){let t=l(16,16);return t.classList.add(`line-icon`),t.append(c(`path`,{d:e,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`})),t}function _(e,t){let{class:n,...r}=t,i=l(16,16);return n!==void 0&&i.classList.add(n),i.append(c(e,r)),i}function v(e){let t=document.createElement(`span`);t.className=`status-icon`,t.dataset.icon=e;for(let n of a[e])t.append(_(n.tag,n.attributes));return t}function y(e,t){e.dataset.icon!==t&&(e.dataset.icon=t,e.replaceChildren(v(t)))}var b={busy:`text-text-muted`,ok:`text-state-done`,error:`text-state-failed`},x=15e3,S=`Something went wrong. Details are hidden in streamer mode.`;function C(e,t){return e!==`error`||t.startsWith(`Not connected to the server. Reconnecting.`)?t:document.documentElement.hasAttribute(`data-streamer`)?S:t}var w={busy:`working`,ok:`complete`,error:`failed`};function T(e){let t=e.querySelector(`:scope > .action-status-icon`),n=e.querySelector(`:scope > .action-status-text`);if(t&&n&&e.childNodes.length===2)return{iconElement:t,textElement:n};let r=o(`span`,`action-status-icon`);r.setAttribute(`aria-hidden`,`true`);let i=o(`span`,`action-status-text`);return e.replaceChildren(r,i),{iconElement:r,textElement:i}}function E(e){e.replaceChildren(),delete e.dataset.tone}function D(e,t,n){if(!n){E(e);return}if(!t){E(e),e.textContent=n;return}e.dataset.tone=t;let{iconElement:r,textElement:i}=T(e);y(r,w[t]),i.textContent=C(t,n)}function O(e=`action-status`){let t=o(`p`,e);return t.setAttribute(`role`,`status`),t.hidden=!0,{element:t,show:(n,r)=>{t.className=`${e} text-xs ${b[n]}`,D(t,n,r),t.hidden=!r},clear:()=>{t.hidden=!0,E(t)}}}function k(t,n){return r(t)?!0:(n.show(`error`,e),!1)}function A(e,t){let n=e instanceof Error?e.message:``;return n===`Request timed out`?`The server did not answer within ${Math.round(t/1e3)} s.`:n||`Not connected to the server. Reconnecting.`}async function j(e,t,r,{busyText:i,timeoutMs:a=x}={}){i&&r.show(`busy`,i);try{let i=await n(e,t,{timeoutMs:a});return r.clear(),i}catch(e){return r.show(`error`,A(e,a)),null}}var M=null,N=3e4,P=null;function F(){let e=document.getElementById(`header-status`),t=document.getElementById(`header-status-text`),n=document.getElementById(`header-status-age`),r=document.getElementById(`header-status-dismiss`);return!e||!t||!n||!r?null:(r.dataset.wired===void 0&&(r.dataset.wired=``,r.addEventListener(`click`,B)),{line:e,text:t,age:n})}function I(){let e=F();if(!e||!M)return;let n=i(Date.now()-M.raisedAt,{...t,justNowBelowSeconds:60});e.age.textContent!==n&&(e.age.textContent=n)}function L({source:e,sessionId:t,message:n,hidesInStreamerMode:r=!0}){let i=F();if(!i)return;let a=r?C(`error`,n):n,s=o(`strong`,`header-status-source`,e);i.text.replaceChildren(s,` ${a}`),i.text.title=`${e}: ${a}`,M={source:e,sessionId:t??null,raisedAt:Date.now()},I(),P??=window.setInterval(I,N),i.line.hidden=!1}function R(e,t){M?.source===e&&(t===void 0||M.sessionId===t)&&B()}function z(e){M?.sessionId===e&&B()}function B(){M=null,P!==null&&window.clearInterval(P),P=null;let e=F();e&&(e.line.hidden=!0,e.text.replaceChildren(),e.text.title=``,e.age.textContent=``)}export{g as _,D as a,j as c,m as d,u as f,f as g,d as h,O as i,k as l,p as m,R as n,L as o,h as p,z as r,A as s,x as t,y as u,l as v,c as y};
@@ -0,0 +1 @@
1
+ import{n as e,o as t,r as n}from"./dom-helpers-CcEFPh-F.js";import{St as r,bt as i,xt as a}from"./index-C8u3ZjM3.js";var o={mine:`Mine`,run:`Run`,cancel:`Cancel`},s=null;function c(e){return e===null?`n/a`:`${Math.round(e*100)}%`}function l(e){if(e===null)return`n/a`;let t=Math.round(e*100);return t>0?`+${t}`:String(t)}function u(e,n,r){let i=t(`button`,`bench-action-button`,o[n]);return i.type=`button`,i.disabled=r,i.addEventListener(`click`,()=>a(e.id,n)),i}function d(e,t){let n=e.inFlight;if(!n||n.suiteId!==t.id)return``;let r=n.caseId?`case ${n.caseId}, `:``;return`Cell ${n.cellIndex+1} of ${n.cellCount}: ${r}arm ${n.armId}, trial ${n.trial}, ${n.phase}.`}function f(e){let n=t(`td`,`bench-score`,c(e?.recall??null));return e&&e.invalid>0&&(n.title=`${e.invalid} invalid or failed cell(s)`),e&&e.degraded>0&&(n.dataset.degraded=`true`),n}function p(e){let n=e.armIds.filter(t=>t!==e.baselineArm),r=t(`table`,`bench-table`),i=t(`tr`);i.append(t(`th`,null,`Case`),...e.armIds.map(n=>t(`th`,null,n===e.baselineArm?`${n} (baseline)`:n))),i.append(...n.map(e=>t(`th`,null,`${e} vs baseline`))),r.append(i);for(let i of e.rows){let a=t(`tr`);a.append(t(`td`,`bench-case`,i.caseId),...e.armIds.map(e=>f(i.arms[e]))),a.append(...n.map(e=>t(`td`,`bench-delta`,l(i.deltaVsBaseline[e]??null)))),r.append(a)}let a=[...new Set(e.armIds.flatMap(t=>Object.keys(e.totals[t]?.recallByTag??{})))].sort(),o=t(`tr`,`bench-total`);o.append(t(`td`,`bench-case`,`Paired recall`),...e.armIds.map(t=>f(e.totals[t]))),r.append(o);for(let n of a){let i=t(`tr`,`bench-total`);i.append(t(`td`,`bench-case`,`Recall, ${n}`),...e.armIds.map(r=>t(`td`,`bench-score`,c(e.totals[r]?.recallByTag[n]??null)))),r.append(i)}return r}function m(e,r){let{isServerConnected:a,pendingActionBySuite:o,outcomeBySuite:s}=i(),c=t(`div`,`bench-suite`),l=e.inFlight?.suiteId===r.id,f=!!e.inFlight&&!l,m=o.has(r.id)||!a,h=t(`div`,`bench-summary`);h.append(t(`span`,`bench-suite-title`,r.title),n(`bench`,r.caseCount===1?`case`:`cases`,String(r.caseCount)),n(`bench`,r.candidateCount===1?`candidate`:`candidates`,String(r.candidateCount)),n(`bench`,`arms`,String(r.armIds.length))),c.append(h);let g=t(`div`,`bench-controls`),_=e.configured===!0&&r.error===null;g.append(u(r,`mine`,!_||m||l),u(r,`run`,!_||m||l||f||r.caseCount===0),u(r,`cancel`,m||!l));let v=t(`span`,`bench-status`,(a?``:`Not connected to the server. Reconnecting.`)||d(e,r)||s.get(r.id)||``);if(v.setAttribute(`role`,`status`),g.append(v),c.append(g),r.error)return c.append(t(`p`,`bench-error`,r.error)),c;let y=r.latestReport;return y?(c.append(t(`p`,`bench-run-line`,`Latest run ${y.runId}: ${y.status}. Only cases every arm scored count toward paired recall.`)),y.rows.length>0&&c.append(p(y)),c):(c.append(t(`p`,`bench-empty`,r.caseCount===0?`Move approved candidates into the cases folder, then choose Run.`:`No run yet.`)),c)}function h(){if(!s)return;s.textContent=``;let{status:n}=i(),r=e(`bench`,`Benchmarks`,`Suites from the benchmarks folder of the Glimmervoid home, one run at a time.`);if(s.append(r),!n)s.append(t(`p`,`bench-empty`,`Waiting for the server.`));else if(!n.configured)s.append(t(`p`,`bench-empty`,n.reason||`Benchmarks are off.`));else if(n.suites.length===0)s.append(t(`p`,`bench-empty`,`No suites yet. Create a folder holding suite.json under benchmarks in the Glimmervoid home.`));else for(let e of n.suites)s.append(m(n,e))}function g(e){s||(s=t(`div`,`bench-content`),e.append(s),r(h),h())}var _={mount:g};export{_ as view};