glimmervoid 0.46.2-next.129 → 0.46.2-next.131

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 (120) hide show
  1. package/dist/bin/glimmervoid.js +13 -13
  2. package/dist/chunks/{adapters-D8F894HY.js → adapters-Czb4h3s-.js} +1 -1
  3. package/dist/chunks/{adapters-Debso6Nj.js → adapters-DVtQx5Fs.js} +5 -5
  4. package/dist/chunks/{agent-api-cli-DioYG2u4.js → agent-api-cli-CSG83t2c.js} +4 -4
  5. package/dist/chunks/{agent-api-cli-CVYoNWsl.js → agent-api-cli-DRzGGM_n.js} +1 -1
  6. package/dist/chunks/{agent-api-core-DygWYNDI.js → agent-api-core-BIitz3NO.js} +3 -3
  7. package/dist/chunks/{agent-setup-cli-BLrIrWTb.js → agent-setup-cli-DpYpnB6s.js} +1 -1
  8. package/dist/chunks/{build-channel-BOrLvUIj.js → build-channel-CwCQx6A3.js} +2 -2
  9. package/dist/chunks/{config-BhD7tb4P.js → config-DCY3jSvU.js} +1 -19
  10. package/dist/chunks/{config-store-DRj0wUWV.js → config-store-4G4l-YqH.js} +2 -21
  11. package/dist/chunks/config-store-BfQmvWFI.js +1 -0
  12. package/dist/chunks/{git-version-C-IkI4sr.js → git-version-WyrLHANY.js} +1 -1
  13. package/dist/chunks/{grok-B8DOqRB-.js → grok-B0SXkBAj.js} +1 -1
  14. package/dist/chunks/{main-CwIQbb0t.js → main-Dktf7LHr.js} +49 -422
  15. package/dist/chunks/{pair-cli-pSxxCt7v.js → pair-cli-D6nQSpfp.js} +2 -2
  16. package/dist/chunks/{remote-config-CKCDKWYU.js → remote-config-CboQE2_Q.js} +1 -1
  17. package/dist/chunks/{session-BF6eF7dw.js → session-B2Wieg0a.js} +5 -21
  18. package/dist/chunks/{session-routes-gzOQJb1W.js → session-routes-Cr9S--Nf.js} +1 -1
  19. package/dist/chunks/{settings-cli-BP-uyH8u.js → settings-cli-BZ-gcH89.js} +5 -5
  20. package/dist/chunks/{settings-readout-core-Cvy3rJLz.js → settings-readout-core-DSYFlRYP.js} +2 -2
  21. package/dist/chunks/{shown-files-core-Bkuessu6.js → shown-files-core-C7ER2sw2.js} +1 -1
  22. package/dist/chunks/{ssh-sign-cli-BpiODQx0.js → ssh-sign-cli-BoYkp3n2.js} +2 -2
  23. package/dist/client/assets/{alert-sound-Deu-O2kQ.js → alert-sound-Cwoduxbr.js} +1 -1
  24. package/dist/client/assets/alert-sound-Cwoduxbr.js.br +0 -0
  25. package/dist/client/assets/{benchmark-panel-B6pAjrlO.js → benchmark-panel-XUkHULmZ.js} +1 -1
  26. package/dist/client/assets/benchmark-panel-XUkHULmZ.js.br +0 -0
  27. package/dist/client/assets/{card-registry-DTBOn8Bd.js → card-registry-AE_x7GR7.js} +1 -1
  28. package/dist/client/assets/card-registry-AE_x7GR7.js.br +0 -0
  29. package/dist/client/assets/{celebration-player-Cf5DwFjN.js → celebration-player-b4i3G8j4.js} +1 -1
  30. package/dist/client/assets/celebration-player-b4i3G8j4.js.br +0 -0
  31. package/dist/client/assets/{control-ws-BGxkawWT.js → control-ws-CklsyQBG.js} +1 -1
  32. package/dist/client/assets/control-ws-CklsyQBG.js.br +0 -0
  33. package/dist/client/assets/{dialogs-ThZLhht_.js → dialogs-DMs0ev1f.js} +2 -2
  34. package/dist/client/assets/dialogs-DMs0ev1f.js.br +0 -0
  35. package/dist/client/assets/doc-editor-ui-Bh-mXxw1.js +1 -0
  36. package/dist/client/assets/doc-editor-ui-Bh-mXxw1.js.br +0 -0
  37. package/dist/client/assets/{first-run-checklist-DQ69ORji.js → first-run-checklist-kvboN5w7.js} +1 -1
  38. package/dist/client/assets/first-run-checklist-kvboN5w7.js.br +0 -0
  39. package/dist/client/assets/{hooks-panel-tXOqrUHw.js → hooks-panel-uI-g8Hll.js} +1 -1
  40. package/dist/client/assets/hooks-panel-uI-g8Hll.js.br +0 -0
  41. package/dist/client/assets/index-C2Guihrw.js +78 -0
  42. package/dist/client/assets/index-C2Guihrw.js.br +0 -0
  43. package/dist/client/assets/index-CVB9CG5c.css +2 -0
  44. package/dist/client/assets/index-CVB9CG5c.css.br +0 -0
  45. package/dist/client/assets/{issues-panel-DzX5iyjG.js → issues-panel-BxJIYK8c.js} +1 -1
  46. package/dist/client/assets/issues-panel-BxJIYK8c.js.br +0 -0
  47. package/dist/client/assets/{nyan-cat-D8iLr_Fu.js → nyan-cat-CQ-zwFYs.js} +1 -1
  48. package/dist/client/assets/nyan-cat-CQ-zwFYs.js.br +0 -0
  49. package/dist/client/assets/phone-shell-Cdgm_Kv7.js +1 -0
  50. package/dist/client/assets/phone-shell-Cdgm_Kv7.js.br +0 -0
  51. package/dist/client/assets/{plan-face-CFPT9PGb.js → plan-face-BPNb61TJ.js} +2 -2
  52. package/dist/client/assets/plan-face-BPNb61TJ.js.br +0 -0
  53. package/dist/client/assets/plan-render-C75HSfzz.js +4 -0
  54. package/dist/client/assets/plan-render-C75HSfzz.js.br +0 -0
  55. package/dist/client/assets/{pr-scope-tabs-CfkDxERy.js → pr-scope-tabs-DH_ARE7O.js} +1 -1
  56. package/dist/client/assets/pr-scope-tabs-DH_ARE7O.js.br +0 -0
  57. package/dist/client/assets/radar-panel-BzkXKeC0.js +1 -0
  58. package/dist/client/assets/radar-panel-BzkXKeC0.js.br +0 -0
  59. package/dist/client/assets/{repo-roots-adder-BuUJoPeG.js → repo-roots-adder-CfQRgYuh.js} +1 -1
  60. package/dist/client/assets/repo-roots-adder-CfQRgYuh.js.br +0 -0
  61. package/dist/client/assets/{resume-dialog-jWY_EzSD.js → resume-dialog-5NPB-zCH.js} +1 -1
  62. package/dist/client/assets/resume-dialog-5NPB-zCH.js.br +0 -0
  63. package/dist/client/assets/review-queue-panel-BWV_EgOI.js +10 -0
  64. package/dist/client/assets/review-queue-panel-BWV_EgOI.js.br +0 -0
  65. package/dist/client/assets/{session-tick-Pvo63zK2.js → session-tick-BVBhKkDl.js} +1 -1
  66. package/dist/client/assets/session-tick-BVBhKkDl.js.br +0 -0
  67. package/dist/client/assets/settings-panel-CFW1ehSN.js +4 -0
  68. package/dist/client/assets/settings-panel-CFW1ehSN.js.br +0 -0
  69. package/dist/client/assets/{shown-lightbox-YlHonAJa.js → shown-lightbox-jWWR8tM3.js} +1 -1
  70. package/dist/client/assets/shown-lightbox-jWWR8tM3.js.br +0 -0
  71. package/dist/client/assets/trace-panel-Du2GCPzg.js +2 -0
  72. package/dist/client/assets/trace-panel-Du2GCPzg.js.br +0 -0
  73. package/dist/client/assets/updates-view-core-Z-HI1v-s.js +1 -0
  74. package/dist/client/assets/updates-view-core-Z-HI1v-s.js.br +0 -0
  75. package/dist/client/assets/usage-panel-xBlHTKId.js +1 -0
  76. package/dist/client/assets/usage-panel-xBlHTKId.js.br +0 -0
  77. package/dist/client/assets/{visions-panel-SBNiN9Os.js → visions-panel-Dkgi70cT.js} +1 -1
  78. package/dist/client/assets/visions-panel-Dkgi70cT.js.br +0 -0
  79. package/dist/client/index.html +6 -6
  80. package/dist/client/index.html.br +0 -0
  81. package/dist/server/index.js +1 -1
  82. package/package.json +1 -1
  83. package/dist/chunks/config-store-CC7iuAI1.js +0 -1
  84. package/dist/client/assets/alert-sound-Deu-O2kQ.js.br +0 -0
  85. package/dist/client/assets/benchmark-panel-B6pAjrlO.js.br +0 -0
  86. package/dist/client/assets/card-registry-DTBOn8Bd.js.br +0 -0
  87. package/dist/client/assets/celebration-player-Cf5DwFjN.js.br +0 -0
  88. package/dist/client/assets/control-ws-BGxkawWT.js.br +0 -0
  89. package/dist/client/assets/dialogs-ThZLhht_.js.br +0 -0
  90. package/dist/client/assets/doc-editor-ui-2H4K5ZBp.js +0 -1
  91. package/dist/client/assets/doc-editor-ui-2H4K5ZBp.js.br +0 -0
  92. package/dist/client/assets/first-run-checklist-DQ69ORji.js.br +0 -0
  93. package/dist/client/assets/hooks-panel-tXOqrUHw.js.br +0 -0
  94. package/dist/client/assets/index-BNOD_DwY.css +0 -2
  95. package/dist/client/assets/index-BNOD_DwY.css.br +0 -0
  96. package/dist/client/assets/index-nxt6LMXr.js +0 -84
  97. package/dist/client/assets/index-nxt6LMXr.js.br +0 -0
  98. package/dist/client/assets/issues-panel-DzX5iyjG.js.br +0 -0
  99. package/dist/client/assets/nyan-cat-D8iLr_Fu.js.br +0 -0
  100. package/dist/client/assets/phone-shell-BDURyW87.js +0 -1
  101. package/dist/client/assets/phone-shell-BDURyW87.js.br +0 -0
  102. package/dist/client/assets/plan-face-CFPT9PGb.js.br +0 -0
  103. package/dist/client/assets/pr-scope-tabs-CfkDxERy.js.br +0 -0
  104. package/dist/client/assets/radar-panel-BgGOypoL.js +0 -1
  105. package/dist/client/assets/radar-panel-BgGOypoL.js.br +0 -0
  106. package/dist/client/assets/repo-roots-adder-BuUJoPeG.js.br +0 -0
  107. package/dist/client/assets/resume-dialog-jWY_EzSD.js.br +0 -0
  108. package/dist/client/assets/review-queue-panel-ubZpHxn9.js +0 -10
  109. package/dist/client/assets/review-queue-panel-ubZpHxn9.js.br +0 -0
  110. package/dist/client/assets/session-tick-Pvo63zK2.js.br +0 -0
  111. package/dist/client/assets/settings-panel-BQ7bYcI0.js +0 -4
  112. package/dist/client/assets/settings-panel-BQ7bYcI0.js.br +0 -0
  113. package/dist/client/assets/shown-lightbox-YlHonAJa.js.br +0 -0
  114. package/dist/client/assets/trace-panel-G-7MhhOz.js +0 -2
  115. package/dist/client/assets/trace-panel-G-7MhhOz.js.br +0 -0
  116. package/dist/client/assets/updates-view-core-D49Cb8qb.js +0 -1
  117. package/dist/client/assets/updates-view-core-D49Cb8qb.js.br +0 -0
  118. package/dist/client/assets/usage-panel-21GwQKME.js +0 -1
  119. package/dist/client/assets/usage-panel-21GwQKME.js.br +0 -0
  120. package/dist/client/assets/visions-panel-SBNiN9Os.js.br +0 -0
@@ -1,6 +1,6 @@
1
1
  import { r as errorMessage } from "./text-DoirglWV.js";
2
- import { l as resolveConfigPath } from "./config-store-DRj0wUWV.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-CKCDKWYU.js";
2
+ import { l as resolveConfigPath } from "./config-store-4G4l-YqH.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-CboQE2_Q.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-BjFK_eSH.js";
6
- import { dt as canonicalizePath, s as glimmervoidHomeDir } from "./config-store-DRj0wUWV.js";
6
+ import { dt as canonicalizePath, s as glimmervoidHomeDir } from "./config-store-4G4l-YqH.js";
7
7
  import fs from "node:fs";
8
8
  import path from "node:path";
9
9
  import crypto from "node:crypto";
@@ -896,27 +896,14 @@ var ConversationQuestion = z.object({
896
896
  })).min(1).max(8),
897
897
  multiSelect: z.boolean().default(false)
898
898
  });
899
- var ConversationApproval = z.object({
899
+ z.object({
900
900
  requestId: z.union([z.string().min(1).max(128), z.number().int()]),
901
- kind: z.enum([
902
- "command",
903
- "fileChange",
904
- "permissions",
905
- "tool",
906
- "question"
907
- ]),
901
+ kind: z.literal("question"),
908
902
  summary: z.string().max(CONVERSATION_APPROVAL_SUMMARY_MAX_CHARS),
909
903
  isSummaryTruncated: z.boolean(),
910
- toolName: z.string().max(200).optional(),
911
- questions: z.array(ConversationQuestion).min(1).max(4).optional(),
912
- alwaysAllowSummary: z.string().max(CONVERSATION_APPROVAL_SUMMARY_MAX_CHARS).optional()
904
+ questions: z.array(ConversationQuestion).min(1).max(4).optional()
913
905
  });
914
- var ConversationAnswers = z.record(z.string().max(CONVERSATION_QUESTION_MAX_CHARS), z.string().max(CONVERSATION_ANSWER_MAX_CHARS));
915
- var ConversationApprovalDecision = z.enum([
916
- "accept",
917
- "acceptForSession",
918
- "decline"
919
- ]);
906
+ z.record(z.string().max(CONVERSATION_QUESTION_MAX_CHARS), z.string().max(CONVERSATION_ANSWER_MAX_CHARS));
920
907
  var COHERENCE_HOOKS_REASON_MAX_CHARS = 80;
921
908
  var COHERENCE_HOOKS_INACTIVE = Object.freeze({
922
909
  notInstalled: "not installed",
@@ -950,9 +937,6 @@ var SessionSnapshot = z.object({
950
937
  activeAgents: z.number().int().nonnegative(),
951
938
  awaitingBackgroundTasks: z.boolean(),
952
939
  pendingPromptKind: z.string().nullable(),
953
- conversationApproval: ConversationApproval.nullable().default(null),
954
- hasConversationBridge: z.boolean().default(false),
955
- isConversationViewOn: z.boolean().default(false),
956
940
  hasPlan: z.boolean().default(false),
957
941
  mergeStatus: z.string().nullable(),
958
942
  mergeReason: z.string().nullable(),
@@ -1153,4 +1137,4 @@ var AgentLimitsReply = z.object({
1153
1137
  }).strict())
1154
1138
  }).strict().extend({ ok: z.literal(true) }).strict();
1155
1139
  //#endregion
1156
- export { MyPrMergeStateResponse as $, MERGEABLE_LIVE_STATES as $t, SHOWN_FILE_CAP_BYTES as A, TeamReviewResolveResponse as At, TaskTitle as B, FULL_SHA_RE as Bt, ConversationQuestion as C, ReviewFinding as Ct, SESSION_DOC_PATH_MAX_CHARS as D, TeamReviewActionRequest as Dt, SESSION_DOC_BODY_CAP_BYTES as E, ReviewVerdict as Et, SessionState as F, TeamReviewThreadsRepository as Ft, MyPrCheckContext as G, REPO_SLUG_RE as Gt, LinkedPr as H, shortSha as Ht, ShownFile as I, canApproveAfterComment as It, MyPrKeepMergeableResult as J, GithubPollingRefreshResult as Jt, MyPrCheckContextsResponse as K, repoParts as Kt, SshSignReply as L, decisionAsIfApprovalRequired as Lt, SSH_SIGN_BODY_CAP_BYTES as M, TeamReviewStatus as Mt, SessionDoc as N, TeamReviewThreadCommentsResponse as Nt, SESSION_NAME_PATTERN as O, TeamReviewActionResult as Ot, SessionSnapshot as P, TeamReviewThreadResult as Pt, MyPrMergeResult as Q, KILLABLE_STATES as Qt, SshSignRequest as R, hasRequiredActionHead as Rt, ConversationApprovalDecision as S, ReviewDraft as St, SESSION_COMMANDS as T, ReviewThreadId as Tt, MyPr as U, GH_SEGMENT as Ut, UnseenOutcome as V, HEX_SHA_RE as Vt, MyPrAutoRebase as W, NODE_ID_RE as Wt, MyPrMergeMethod as X, githubPollingShape as Xt, MyPrLaneEntry as Y, GithubPrsFreshness as Yt, MyPrMergeRequest as Z, BADGE_LABELS as Zt, CONVERSATION_PERMISSION_HOOK_EVENT as _, PostedReviewEvent as _t, AgentAttentionRequest as a, MyPrsSnapshot as at, ConversationAnswers as b, ReviewChecksState as bt, AgentLimitsReply as c, SessionPrLinks as ct, AgentSendRequest as d, CommitSha as dt, RESTARTABLE_STATES as en, MyPrMergeWhenReadyRequest as et, AgentSettingsReply as f, DECIDING_REVIEW_STATES as ft, CONVERSATION_APPROVAL_SUMMARY_MAX_CHARS as g, GithubReviewState as gt, COHERENCE_HOOKS_INACTIVE as h, GithubReviewDecision as ht, AgentAnswerRequest as i, MyPrThreadsResponse as it, SIGN_URL_ENV as j, TeamReviewStateEntry as jt, SESSION_NAME_RULE_TEXT as k, TeamReviewCompareFiles as kt, AgentPullRequestRequest as l, pullRequestKeyFormat as lt, AgentSpawnRequest as m, FindingSeverity as mt, AGENT_URL_ENV as n, MyPrSearchNode as nt, AgentCloseRequest as o, MyPrsState as ot, AgentSettingsRequest as p, EarlierReview as pt, MyPrKeepMergeableRequest as q, GithubPollingRefreshRequest as qt, ASK_USER_QUESTION_TOOL_NAME as r, MyPrThreadNode as rt, AgentEditRequest as s, MyPrsStatus as st, AGENT_API_VERBS as t, STATES as tn, MyPrMergeWhenReadyResult as tt, AgentReadRequest as u, repositoryName as ut, CONVERSATION_TOOL_RESULT_HOOK_EVENT as v, PostingPlan as vt, RefinedTaskTitle as w, ReviewResult as wt, ConversationApproval as x, ReviewComment as xt, CoherenceHooksState as y, PrDetail as yt, TASK_TITLE_CONTROL_CHARACTERS as z, hasStandingViewerApproval as zt };
1140
+ export { MyPrSearchNode as $, SessionDoc as A, TeamReviewThreadCommentsResponse as At, MyPr as B, GH_SEGMENT as Bt, SESSION_DOC_BODY_CAP_BYTES as C, ReviewVerdict as Ct, SHOWN_FILE_CAP_BYTES as D, TeamReviewResolveResponse as Dt, SESSION_NAME_RULE_TEXT as E, TeamReviewCompareFiles as Et, SshSignRequest as F, hasRequiredActionHead as Ft, MyPrKeepMergeableResult as G, GithubPollingRefreshResult as Gt, MyPrCheckContext as H, REPO_SLUG_RE as Ht, TASK_TITLE_CONTROL_CHARACTERS as I, hasStandingViewerApproval as It, MyPrMergeRequest as J, BADGE_LABELS as Jt, MyPrLaneEntry as K, GithubPrsFreshness as Kt, TaskTitle as L, FULL_SHA_RE as Lt, SessionState as M, TeamReviewThreadsRepository as Mt, ShownFile as N, canApproveAfterComment as Nt, SIGN_URL_ENV as O, TeamReviewStateEntry as Ot, SshSignReply as P, decisionAsIfApprovalRequired as Pt, MyPrMergeWhenReadyResult as Q, STATES as Qt, UnseenOutcome as R, HEX_SHA_RE as Rt, SESSION_COMMANDS as S, ReviewThreadId as St, SESSION_NAME_PATTERN as T, TeamReviewActionResult as Tt, MyPrCheckContextsResponse as U, repoParts as Ut, MyPrAutoRebase as V, NODE_ID_RE as Vt, MyPrKeepMergeableRequest as W, GithubPollingRefreshRequest as Wt, MyPrMergeStateResponse as X, MERGEABLE_LIVE_STATES as Xt, MyPrMergeResult as Y, KILLABLE_STATES as Yt, MyPrMergeWhenReadyRequest as Z, RESTARTABLE_STATES as Zt, CONVERSATION_PERMISSION_HOOK_EVENT as _, ReviewChecksState as _t, AgentAttentionRequest as a, SessionPrLinks as at, ConversationQuestion as b, ReviewFinding as bt, AgentLimitsReply as c, CommitSha as ct, AgentSendRequest as d, FindingSeverity as dt, MyPrThreadNode as et, AgentSettingsReply as f, GithubReviewDecision as ft, CONVERSATION_APPROVAL_SUMMARY_MAX_CHARS as g, PrDetail as gt, COHERENCE_HOOKS_INACTIVE as h, PostingPlan as ht, AgentAnswerRequest as i, MyPrsStatus as it, SessionSnapshot as j, TeamReviewThreadResult as jt, SSH_SIGN_BODY_CAP_BYTES as k, TeamReviewStatus as kt, AgentPullRequestRequest as l, DECIDING_REVIEW_STATES as lt, AgentSpawnRequest as m, PostedReviewEvent as mt, AGENT_URL_ENV as n, MyPrsSnapshot as nt, AgentCloseRequest as o, pullRequestKeyFormat as ot, AgentSettingsRequest as p, GithubReviewState as pt, MyPrMergeMethod as q, githubPollingShape as qt, ASK_USER_QUESTION_TOOL_NAME as r, MyPrsState as rt, AgentEditRequest as s, repositoryName as st, AGENT_API_VERBS as t, MyPrThreadsResponse as tt, AgentReadRequest as u, EarlierReview as ut, CONVERSATION_TOOL_RESULT_HOOK_EVENT as v, ReviewComment as vt, SESSION_DOC_PATH_MAX_CHARS as w, TeamReviewActionRequest as wt, RefinedTaskTitle as x, ReviewResult as xt, CoherenceHooksState as y, ReviewDraft as yt, LinkedPr as z, shortSha as zt };
@@ -1,4 +1,4 @@
1
- import { T as SESSION_COMMANDS } from "./session-BF6eF7dw.js";
1
+ import { S as SESSION_COMMANDS } from "./session-B2Wieg0a.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 SPAWN_LINE = "To delegate work that edits files or runs long, use glimmervoid spawn rather than an in-process subagent: the spawned session gets its own dashboard card the operator can watch. An in-process subagent stays fine for a quick read-only lookup.";
@@ -1,11 +1,11 @@
1
1
  import { r as errorMessage, t as errorCode } from "./text-DoirglWV.js";
2
2
  import { n as glimmervoidHomeDir, t as decideConfigPath } from "./config-path-core-DUWk0Lui.js";
3
- import { f as AgentSettingsReply } from "./session-BF6eF7dw.js";
4
- import { r as BrowserConfig } from "./config-BhD7tb4P.js";
3
+ import { f as AgentSettingsReply } from "./session-B2Wieg0a.js";
4
+ import { r as BrowserConfig } from "./config-DCY3jSvU.js";
5
5
  import { n as isRecord } from "./coerce-NSst8oRP.js";
6
6
  import { t as renderTable } from "./ascii-figure-core-pDAwtlKO.js";
7
- import { A as setValueAtPath, F as SETTINGS_REGISTRY, N as valueAtPath, O as parsePosthogProjectSelection, T as deleteValueAtPath, c as loadConfigFile, d as validateConfig, et as ENV_SECRET_BINDINGS, f as isSettingAvailable, k as scoreSettingsSearch, r as IS_EXPERIMENTAL_BUILD, rt as withEnvSecrets, tt as readEnvSecrets, u as saveConfigFileOnce, w as cloneValue } from "./config-store-DRj0wUWV.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 availableSettings } from "./settings-readout-core-Cvy3rJLz.js";
7
+ import { A as setValueAtPath, F as SETTINGS_REGISTRY, N as valueAtPath, O as parsePosthogProjectSelection, T as deleteValueAtPath, c as loadConfigFile, d as validateConfig, et as ENV_SECRET_BINDINGS, f as isSettingAvailable, k as scoreSettingsSearch, r as IS_EXPERIMENTAL_BUILD, rt as withEnvSecrets, tt as readEnvSecrets, u as saveConfigFileOnce, w as cloneValue } from "./config-store-4G4l-YqH.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 availableSettings } from "./settings-readout-core-DSYFlRYP.js";
9
9
  import fs from "node:fs";
10
10
  import os from "node:os";
11
11
  import { parseArgs } from "node:util";
@@ -330,7 +330,7 @@ function processIo() {
330
330
  async function runSettingsCli(commandArguments, io = processIo()) {
331
331
  const serverRequest = settingsRequestForServer(commandArguments, process.env);
332
332
  if (!serverRequest) return runSettingsCommand(commandArguments, io);
333
- const { askAgentApi } = await import("./agent-api-cli-CVYoNWsl.js");
333
+ const { askAgentApi } = await import("./agent-api-cli-DRzGGM_n.js");
334
334
  const reply = AgentSettingsReply.safeParse(await askAgentApi("settings", serverRequest).catch((error) => ({
335
335
  ok: false,
336
336
  error: errorMessage(error)
@@ -1,6 +1,6 @@
1
- import { p as AgentSettingsRequest } from "./session-BF6eF7dw.js";
1
+ import { p as AgentSettingsRequest } from "./session-B2Wieg0a.js";
2
2
  import { t as renderTable } from "./ascii-figure-core-pDAwtlKO.js";
3
- import { C as SETTINGS_INDEX, D as hasScaledUnit, E as displayText, F as SETTINGS_REGISTRY, M as settingsOf, N as valueAtPath, P as FILE_ONLY_GROUPS, f as isSettingAvailable, j as settingsGroupOf, tt as readEnvSecrets, w as cloneValue } from "./config-store-DRj0wUWV.js";
3
+ import { C as SETTINGS_INDEX, D as hasScaledUnit, E as displayText, F as SETTINGS_REGISTRY, M as settingsOf, N as valueAtPath, P as FILE_ONLY_GROUPS, f as isSettingAvailable, j as settingsGroupOf, tt as readEnvSecrets, w as cloneValue } from "./config-store-4G4l-YqH.js";
4
4
  import { parseArgs } from "node:util";
5
5
  //#region server/core/settings-readout-core.ts
6
6
  var VALUE_COLUMN_WIDTH = 40;
@@ -1,4 +1,4 @@
1
- import { A as SHOWN_FILE_CAP_BYTES } from "./session-BF6eF7dw.js";
1
+ import { D as SHOWN_FILE_CAP_BYTES } from "./session-B2Wieg0a.js";
2
2
  import path from "node:path";
3
3
  //#region server/core/shown-files-core.ts
4
4
  var SHOWN_SNIFF_BYTES = 65536;
@@ -1,8 +1,8 @@
1
1
  import { r as errorMessage } from "./text-DoirglWV.js";
2
- import { L as SshSignReply, j as SIGN_URL_ENV } from "./session-BF6eF7dw.js";
2
+ import { O as SIGN_URL_ENV, P as SshSignReply } from "./session-B2Wieg0a.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-DioYG2u4.js";
5
+ import { n as postToAgentIngress } from "./agent-api-cli-CSG83t2c.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";
@@ -1 +1 @@
1
- import{Gi as e,Ji as t,Ki as n,Ui as r,Wi as i,Xi as a,Yi as o,qi as s}from"./index-nxt6LMXr.js";var c=.3,l=null;function u(){return a(l)}function d(e){return o(e,l)}async function f(){try{let e=await fetch(r,{credentials:`same-origin`,cache:`no-store`});e.ok&&(l=t(await e.json()))}catch{}}function p(){let e=new AudioContext;return e.state===`suspended`&&e.resume(),e}function m(e,t){setTimeout(()=>e.close().catch(()=>{}),(t+.1)*1e3)}function h(t){g(e[t]??e.chime)}function g(e){let t=p(),n=t.createGain();n.gain.value=e.peakGain,n.connect(t.destination);let r=t.currentTime,i=0;for(let a of e.tones){let e=r+a.startSeconds,o=e+a.durationSeconds,s=t.createOscillator(),c=t.createGain();s.type=a.waveform,s.frequency.setValueAtTime(a.frequency,e),a.endFrequency&&s.frequency.exponentialRampToValueAtTime(a.endFrequency,o),c.gain.setValueAtTime(.001,e),c.gain.exponentialRampToValueAtTime(a.gain??1,e+.01),c.gain.exponentialRampToValueAtTime(.001,o),s.connect(c),c.connect(n),s.start(e),s.stop(o),i=Math.max(i,a.startSeconds+a.durationSeconds)}m(t,i)}async function _(e){try{let t=await fetch(s(e),{credentials:`same-origin`});return t.ok?await t.arrayBuffer():null}catch{return null}}async function v(e){let t=await _(e);if(!t)return!1;let n=p();try{let e=await n.decodeAudioData(t),r=n.createGain();r.gain.value=c,r.connect(n.destination);let i=n.createBufferSource();return i.buffer=e,i.connect(r),i.start(),m(n,e.duration),!0}catch{return n.close().catch(()=>{}),!1}}var y=[659.25,830.61,987.77,1108.73,987.77,830.61,739.99,659.25,739.99,830.61,987.77,1108.73,987.77,830.61];function b(){try{let e=new AudioContext;if(e.state===`suspended`&&e.resume(),e.state===`suspended`)return;let t=e.createGain();t.gain.value=.05,t.connect(e.destination);let n=.125,r=e.currentTime;for(let i=0;i<y.length;i++){let a=r+i*n,o=e.createOscillator(),s=e.createGain();o.type=`square`,o.frequency.value=y[i],s.gain.setValueAtTime(.001,a),s.gain.exponentialRampToValueAtTime(1,a+.01),s.gain.exponentialRampToValueAtTime(.001,a+n*.9),o.connect(s),s.connect(t),o.start(a),o.stop(a+n)}let i=r+y.length*n;t.gain.setValueAtTime(.05,i-.05),t.gain.exponentialRampToValueAtTime(.001,i),setTimeout(()=>e.close().catch(()=>{}),(i-r+.1)*1e3)}catch{}}function x(){try{h(i)}catch{}}function S(e){try{let t=d(e),r=n(t);if(!r){h(t);return}v(r).then(e=>{e||x()})}catch{}}export{f as loadCustomSounds,S as playAlertSound,b as playNyanJingle,g as playToneSequence,d as resolveSoundId,u as soundOptions};
1
+ import{Bi as e,Gi as t,Hi as n,Ki as r,Ui as i,Vi as a,Wi as o,zi as s}from"./index-C2Guihrw.js";var c=.3,l=null;function u(){return r(l)}function d(e){return t(e,l)}async function f(){try{let e=await fetch(s,{credentials:`same-origin`,cache:`no-store`});e.ok&&(l=o(await e.json()))}catch{}}function p(){let e=new AudioContext;return e.state===`suspended`&&e.resume(),e}function m(e,t){setTimeout(()=>e.close().catch(()=>{}),(t+.1)*1e3)}function h(e){g(a[e]??a.chime)}function g(e){let t=p(),n=t.createGain();n.gain.value=e.peakGain,n.connect(t.destination);let r=t.currentTime,i=0;for(let a of e.tones){let e=r+a.startSeconds,o=e+a.durationSeconds,s=t.createOscillator(),c=t.createGain();s.type=a.waveform,s.frequency.setValueAtTime(a.frequency,e),a.endFrequency&&s.frequency.exponentialRampToValueAtTime(a.endFrequency,o),c.gain.setValueAtTime(.001,e),c.gain.exponentialRampToValueAtTime(a.gain??1,e+.01),c.gain.exponentialRampToValueAtTime(.001,o),s.connect(c),c.connect(n),s.start(e),s.stop(o),i=Math.max(i,a.startSeconds+a.durationSeconds)}m(t,i)}async function _(e){try{let t=await fetch(i(e),{credentials:`same-origin`});return t.ok?await t.arrayBuffer():null}catch{return null}}async function v(e){let t=await _(e);if(!t)return!1;let n=p();try{let e=await n.decodeAudioData(t),r=n.createGain();r.gain.value=c,r.connect(n.destination);let i=n.createBufferSource();return i.buffer=e,i.connect(r),i.start(),m(n,e.duration),!0}catch{return n.close().catch(()=>{}),!1}}var y=[659.25,830.61,987.77,1108.73,987.77,830.61,739.99,659.25,739.99,830.61,987.77,1108.73,987.77,830.61];function b(){try{let e=new AudioContext;if(e.state===`suspended`&&e.resume(),e.state===`suspended`)return;let t=e.createGain();t.gain.value=.05,t.connect(e.destination);let n=.125,r=e.currentTime;for(let i=0;i<y.length;i++){let a=r+i*n,o=e.createOscillator(),s=e.createGain();o.type=`square`,o.frequency.value=y[i],s.gain.setValueAtTime(.001,a),s.gain.exponentialRampToValueAtTime(1,a+.01),s.gain.exponentialRampToValueAtTime(.001,a+n*.9),o.connect(s),s.connect(t),o.start(a),o.stop(a+n)}let i=r+y.length*n;t.gain.setValueAtTime(.05,i-.05),t.gain.exponentialRampToValueAtTime(.001,i),setTimeout(()=>e.close().catch(()=>{}),(i-r+.1)*1e3)}catch{}}function x(){try{h(e)}catch{}}function S(e){try{let t=d(e),r=n(t);if(!r){h(t);return}v(r).then(e=>{e||x()})}catch{}}export{f as loadCustomSounds,S as playAlertSound,b as playNyanJingle,g as playToneSequence,d as resolveSoundId,u as soundOptions};
@@ -1 +1 @@
1
- import"./updates-view-core-D49Cb8qb.js";import{n as e,o as t,r as n}from"./dom-helpers-C7P3_59O.js";import{J as r,Y as i,q as a}from"./index-nxt6LMXr.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,i){let a=t(`button`,`bench-action-button`,o[n]);return a.type=`button`,a.disabled=i,a.addEventListener(`click`,()=>r(e.id,n)),a}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:i,pendingActionBySuite:o,outcomeBySuite:s}=a(),c=t(`div`,`bench-suite`),l=e.inFlight?.suiteId===r.id,f=!!e.inFlight&&!l,m=o.has(r.id)||!i,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`,(i?``:`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}=a(),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),i(h),h())}var _={mount:g};export{_ as view};
1
+ import"./updates-view-core-Z-HI1v-s.js";import{n as e,o as t,r as n}from"./dom-helpers-C7P3_59O.js";import{J as r,Y as i,q as a}from"./index-C2Guihrw.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,i){let a=t(`button`,`bench-action-button`,o[n]);return a.type=`button`,a.disabled=i,a.addEventListener(`click`,()=>r(e.id,n)),a}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:i,pendingActionBySuite:o,outcomeBySuite:s}=a(),c=t(`div`,`bench-suite`),l=e.inFlight?.suiteId===r.id,f=!!e.inFlight&&!l,m=o.has(r.id)||!i,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`,(i?``:`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}=a(),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),i(h),h())}var _={mount:g};export{_ as view};
@@ -1 +1 @@
1
- import{bt as e}from"./updates-view-core-D49Cb8qb.js";import{E as t}from"./dom-helpers-C7P3_59O.js";var n=new Map(Object.entries({WAITING:`now`,COMPLETE:`later`,FAILED:`resting`,IDLE:`resting`,RUNNING:`resting`,STARTING:`resting`,INITIALIZING:`resting`,DORMANT:`resting`,DONE:`resting`}));function r(e){return(typeof e.state==`string`?n.get(e.state):void 0)??`resting`}function i(e,n){return[...e].map(([e,r])=>{let i=r.currentState||t.DORMANT;return{id:e,ui:r,name:n(r),isDormant:i===t.DORMANT,state:i,unseenOutcome:r.unseenOutcome??null,ownerId:r.ownerId??null}})}function a(e){let t=new Set(e.map(({id:e})=>e)),n=e=>e.ownerId&&t.has(e.ownerId)?e.ownerId:null,r=new Map;for(let t of e){let e=n(t);e&&r.set(e,[...r.get(e)??[],t])}return e.flatMap(e=>n(e)?[]:[e,...r.get(e.id)??[]])}function o(e){return a([...e].sort((e,t)=>Number(e.isDormant===!0)-Number(t.isDormant===!0)))}function s({ownerName:e,ownedCount:t}){return e===null?t===1?`Owns 1 session`:t>1?`Owns ${t} sessions`:null:`Owned by ${e}`}function c(e,t,n){if(!e.length)return null;let r=n<0?-1:1,i=t==null?-1:e.indexOf(t);return e[((i===-1?r===1?-1:0:i)+r+e.length)%e.length]}function l({state:n,unseenOutcome:r}){if(n===t.WAITING)return`waiting`;let i=e.safeParse(r);return i.success?i.data:null}function u(e={}){return l(e)!==null}var d=new Map([[`failed`,0],[`waiting`,1],[`finished`,2]]);function f(e){let t=l(e);return t===null?void 0:d.get(t)}function p(e){return e.filter(e=>f(e)!==void 0).sort((e,t)=>(f(e)??0)-(f(t)??0)).map(({id:e})=>e)}function m(e,t){let n=new Map(e.map(e=>[e.id,e]));return p(e).flatMap(e=>{let r=n.get(e),i=r?l(r):null;return!r||i===null||e===t?[]:[{id:e,kind:i,name:r.name??``}]})}var h={headTile:32,tile:26,tileGap:4,overflowSlot:40};function g(e,t){if(t===0)return 0;let{headTile:n,tile:r,tileGap:i,overflowSlot:a}=h,o=r+i;if(n+(t-1)*o<=e)return t;let s=e-a-i-n,c=Math.floor(s/o);return Math.max(1,Math.min(t-1,1+c))}var _={waiting:`waitingCount`,failed:`failedCount`,finished:`finishedCount`};function v(e,t,n){let r=l(t||{});r!==null&&(e[_[r]]+=n)}function y(e){let t={waitingCount:0,finishedCount:0,failedCount:0};for(let n of e||[])v(t,n,1);return t}function b(){return{counts:{waitingCount:0,finishedCount:0,failedCount:0},ownedCountByOwnerId:new Map}}function x(e,t,n){if(v(e.counts,t,n),t.ownerId===null)return;let r=(e.ownedCountByOwnerId.get(t.ownerId)??0)+n;r>0?e.ownedCountByOwnerId.set(t.ownerId,r):e.ownedCountByOwnerId.delete(t.ownerId)}function S(e,t){x(e,t,1)}function C(e,t){x(e,t,-1)}function w({waitingCount:e,finishedCount:t,failedCount:n}){return e+n+t}function T({waitingCount:e,failedCount:t}){return e+t}function E({waitingCount:e,finishedCount:t,failedCount:n}){let r=[];return n>0&&r.push(`${n} FAILED`),e===1&&r.push(`1 NEEDS YOU`),e>1&&r.push(`${e} NEED YOU`),t>0&&r.push(`${t} FINISHED`),r.length===0?`ALL CLEAR`:r.join(`, `)}var D=new Map([[`hand`,2]]),O=1;function k(e){return e?typeof e==`string`&&D.get(e)||O:0}function A(e){let t=!1,n=0;for(let r of e||[]){let e=k(r);e<=n||(t=typeof r!=`string`||r,n=e)}return t}var j=new Map,M=b();function N(e){return e.card?.dataset.session||e.nameEl?.textContent||``}function P(e){return typeof e==`string`?e:String(e)}function F(e){return typeof e==`string`?j.get(e):void 0}var I=document.getElementById(`sessions-container`);export{T as S,c as _,N as a,S as b,E as c,s as d,g as f,o as g,m as h,P as i,i as l,u as m,I as n,j as o,w as p,F as r,h as s,M as t,y as u,A as v,C as x,r as y};
1
+ import{bt as e}from"./updates-view-core-Z-HI1v-s.js";import{E as t}from"./dom-helpers-C7P3_59O.js";var n=new Map(Object.entries({WAITING:`now`,COMPLETE:`later`,FAILED:`resting`,IDLE:`resting`,RUNNING:`resting`,STARTING:`resting`,INITIALIZING:`resting`,DORMANT:`resting`,DONE:`resting`}));function r(e){return(typeof e.state==`string`?n.get(e.state):void 0)??`resting`}function i(e,n){return[...e].map(([e,r])=>{let i=r.currentState||t.DORMANT;return{id:e,ui:r,name:n(r),isDormant:i===t.DORMANT,state:i,unseenOutcome:r.unseenOutcome??null,ownerId:r.ownerId??null}})}function a(e){let t=new Set(e.map(({id:e})=>e)),n=e=>e.ownerId&&t.has(e.ownerId)?e.ownerId:null,r=new Map;for(let t of e){let e=n(t);e&&r.set(e,[...r.get(e)??[],t])}return e.flatMap(e=>n(e)?[]:[e,...r.get(e.id)??[]])}function o(e){return a([...e].sort((e,t)=>Number(e.isDormant===!0)-Number(t.isDormant===!0)))}function s({ownerName:e,ownedCount:t}){return e===null?t===1?`Owns 1 session`:t>1?`Owns ${t} sessions`:null:`Owned by ${e}`}function c(e,t,n){if(!e.length)return null;let r=n<0?-1:1,i=t==null?-1:e.indexOf(t);return e[((i===-1?r===1?-1:0:i)+r+e.length)%e.length]}function l({state:n,unseenOutcome:r}){if(n===t.WAITING)return`waiting`;let i=e.safeParse(r);return i.success?i.data:null}function u(e={}){return l(e)!==null}var d=new Map([[`failed`,0],[`waiting`,1],[`finished`,2]]);function f(e){let t=l(e);return t===null?void 0:d.get(t)}function p(e){return e.filter(e=>f(e)!==void 0).sort((e,t)=>(f(e)??0)-(f(t)??0)).map(({id:e})=>e)}function m(e,t){let n=new Map(e.map(e=>[e.id,e]));return p(e).flatMap(e=>{let r=n.get(e),i=r?l(r):null;return!r||i===null||e===t?[]:[{id:e,kind:i,name:r.name??``}]})}var h={headTile:32,tile:26,tileGap:4,overflowSlot:40};function g(e,t){if(t===0)return 0;let{headTile:n,tile:r,tileGap:i,overflowSlot:a}=h,o=r+i;if(n+(t-1)*o<=e)return t;let s=e-a-i-n,c=Math.floor(s/o);return Math.max(1,Math.min(t-1,1+c))}var _={waiting:`waitingCount`,failed:`failedCount`,finished:`finishedCount`};function v(e,t,n){let r=l(t||{});r!==null&&(e[_[r]]+=n)}function y(e){let t={waitingCount:0,finishedCount:0,failedCount:0};for(let n of e||[])v(t,n,1);return t}function b(){return{counts:{waitingCount:0,finishedCount:0,failedCount:0},ownedCountByOwnerId:new Map}}function x(e,t,n){if(v(e.counts,t,n),t.ownerId===null)return;let r=(e.ownedCountByOwnerId.get(t.ownerId)??0)+n;r>0?e.ownedCountByOwnerId.set(t.ownerId,r):e.ownedCountByOwnerId.delete(t.ownerId)}function S(e,t){x(e,t,1)}function C(e,t){x(e,t,-1)}function w({waitingCount:e,finishedCount:t,failedCount:n}){return e+n+t}function T({waitingCount:e,failedCount:t}){return e+t}function E({waitingCount:e,finishedCount:t,failedCount:n}){let r=[];return n>0&&r.push(`${n} FAILED`),e===1&&r.push(`1 NEEDS YOU`),e>1&&r.push(`${e} NEED YOU`),t>0&&r.push(`${t} FINISHED`),r.length===0?`ALL CLEAR`:r.join(`, `)}var D=new Map([[`hand`,2]]),O=1;function k(e){return e?typeof e==`string`&&D.get(e)||O:0}function A(e){let t=!1,n=0;for(let r of e||[]){let e=k(r);e<=n||(t=typeof r!=`string`||r,n=e)}return t}var j=new Map,M=b();function N(e){return e.card?.dataset.session||e.nameEl?.textContent||``}function P(e){return typeof e==`string`?e:String(e)}function F(e){return typeof e==`string`?j.get(e):void 0}var I=document.getElementById(`sessions-container`);export{T as S,c as _,N as a,S as b,E as c,s as d,g as f,o as g,m as h,P as i,i as l,u as m,I as n,j as o,w as p,F as r,h as s,M as t,y as u,A as v,C as x,r as y};
@@ -1 +1 @@
1
- import{_ as e,o as t,s as n}from"./dom-helpers-C7P3_59O.js";import{bi as r,na as i}from"./index-nxt6LMXr.js";import{playToneSequence as a}from"./alert-sound-Deu-O2kQ.js";var o=1.2,s=1.55,c=.12,l=523.25,u=2,d=8,f=(e,t,n)=>({semitone:e,startBeat:t,beats:n}),p={melody:[f(7,4,.5),f(11,4.5,.5),f(12,5,3)],bass:[f(-5,4,1),f(-12,5,3)]},m=[{melody:[f(0,0,1),f(4,1,1),f(7,2,1),f(9,3,1)],bass:[f(-12,0,2),f(-8,2,2)]},{melody:[f(7,0,.67),f(7,.67,.67),f(7,1.33,.67),f(9,2,1),f(5,3,1)],bass:[f(-12,0,2),f(-7,2,2)]},{melody:[f(5,0,1),f(9,1,1),f(7,2,1),f(4,3,1)],bass:[f(-7,0,2),f(-12,2,2)]},{melody:[f(12,0,.5),f(7,.5,.5),f(12,1,.5),f(16,1.5,.5),f(16,2,1),f(14,3,1)],bass:[f(-12,0,2),f(-3,2,2)]},{melody:[f(4,0,1),f(7,1,1),f(4,2,.5),f(5,2.5,.5),f(7,3,.5),f(4,3.5,.5)],bass:[f(-8,0,2),f(-12,2,2)]}].map(e=>({melody:[...e.melody,...p.melody],bass:[...e.bass,...p.bass]}));function h(e,t){return l*2**((e+t)/12)}function g(e,t){let n=(e,n,r)=>e.map(e=>({frequency:h(e.semitone,t),startSeconds:s+e.startBeat*c,durationSeconds:e.beats*c,waveform:n,gain:r}));return[...n(e.melody,`square`,.2),...n(e.melody,`triangle`,.5),...n(e.bass,`triangle`,.6)]}var ee=[{frequency:220,endFrequency:880,startSeconds:0,durationSeconds:.32,waveform:`triangle`,gain:.25},{frequency:160,endFrequency:45,startSeconds:o,durationSeconds:.28,waveform:`sine`,gain:1},{frequency:1400,endFrequency:380,startSeconds:o,durationSeconds:.06,waveform:`square`,gain:.12}];function te(e){let t=m[e%m.length],n=Math.min(e*u,d);return{peakGain:.1,tones:[...ee,...g(t,n)]}}function _(e){return Math.round(Math.sqrt(2*e/780)*1e3)}function v(e,t,n=Math.random){return Math.round(e+n()*(t-e))}function y(e,t=Math.random){let n=[...e];for(let e=n.length-1;e>0;--e){let r=Math.floor(t()*(e+1));[n[e],n[r]]=[n[r],n[e]]}return n}var ne=.6,re=.25,ie=1.6;function ae(e){return Math.min(ne+e*re,ie)}var b=[`var(--accent)`,`var(--state-running)`,`var(--state-idle)`,`var(--state-waiting)`,`var(--state-failed)`];function oe(e,t=Math.random){let n=v(320,520,t),r=v(1800,2800,t);return[[`--confetti-start-x`,`${v(4,96,t)}%`],[`--confetti-x`,`${v(-140,140,t)}px`],[`--confetti-rise`,`${-v(20,55,t)}px`],[`--confetti-fall`,`${v(45,70,t)}vh`],[`--confetti-rise-ms`,`${n}ms`],[`--confetti-fall-ms`,`${r}ms`],[`--confetti-flight-ms`,`${n+r}ms`],[`--confetti-tilt`,`${v(0,180,t)}deg`],[`--confetti-spin`,`${v(-360,360,t)}deg`],[`--confetti-flutter-ms`,`${v(160,340,t)}ms`],[`--confetti-delay`,`${v(0,160,t)}ms`],[`--confetti-color`,b[e%b.length]]]}var se=`<svg viewBox="0 0 36 36" aria-hidden="true"><circle class="merge-bullseye-ring-light" cx="18" cy="18" r="17"/><circle class="merge-bullseye-ring-red" cx="18" cy="18" r="13"/><circle class="merge-bullseye-ring-light" cx="18" cy="18" r="9"/><circle class="merge-bullseye-ring-red" cx="18" cy="18" r="5"/></svg>`,ce=`<svg viewBox="0 0 26 8" aria-hidden="true"><path class="merge-bullseye-dart-flight" d="M0 0L7 3V5L0 8L2 4Z"/><rect class="merge-bullseye-dart-shaft" x="6" y="3.3" width="8" height="1.4"/><rect class="merge-bullseye-dart-barrel" x="13" y="2.5" width="7" height="3" rx="1"/><path class="merge-bullseye-dart-tip" d="M20 3L26 4L20 5Z"/></svg>`;function le(){let e=n(`div`,`merge-bullseye-target`,se);return e.append(t(`span`,`merge-bullseye-ripple`)),e}function ue(){let e=t(`div`,`merge-bullseye-dart-drift`),r=t(`div`,`merge-bullseye-dart-arc`),i=t(`div`,`merge-bullseye-dart-aim`);return i.append(n(`div`,`merge-bullseye-dart`,ce)),r.append(i),e.append(r),e}function de(){let e=t(`div`,`merge-bullseye-range`),n=t(`div`,`merge-bullseye-track`);return n.append(ue()),e.append(le(),n),e}var fe={title:`BULLSEYE!`,buildScene:de},pe=6,x=30,S=-14,C=16;function w(e=Math.random){return[[`--crosshair-start-left`,`${v(pe,x,e)}%`],[`--crosshair-start-offset-y`,`${v(S,C,e)}px`]]}var T=`<svg viewBox="0 0 26 40" aria-hidden="true"><path class="merge-headshot-target-body" d="M9 13H17L18 16Q25 18 25 24V40H1V24Q1 18 8 16Z"/><circle class="merge-headshot-target-head" cx="13" cy="7" r="6"/><circle class="merge-headshot-target-ring" cx="13" cy="7" r="3"/><circle class="merge-headshot-target-ring" cx="13" cy="27" r="6"/><circle class="merge-headshot-target-ring" cx="13" cy="27" r="2.5"/></svg>`,E=`<svg viewBox="0 0 22 22" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="M11 0V5M11 17V22M0 11H5M17 11H22"/><circle class="merge-headshot-crosshair-dot" cx="11" cy="11" r="1"/></svg>`,D=`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 3L8 8M21 3L16 8M3 21L8 16M21 21L16 16"/></svg>`;function O(){let r=t(`div`,`merge-headshot-sweep`);e(r,w());let i=t(`div`,`merge-headshot-aim`);i.append(n(`div`,`merge-headshot-crosshair`,E));let a=t(`div`,`merge-headshot-bob`);return a.append(i,n(`div`,`merge-headshot-hitmarker`,D)),r.append(a),r}function k(){let e=t(`div`,`merge-headshot-range`),r=t(`div`,`merge-headshot-track`);return r.append(O()),e.append(n(`div`,`merge-headshot-target`,T),r),e}var A={title:`HEADSHOT!`,buildScene:k},j=[`10`,`J`,`Q`,`K`,`A`],M=160,N=19,P=5,F=9,I=780,L=70,R=70,z=35;function B(e){let t=j.length-1,n=e-t/2;return{offsetPx:n*N,titleSpreadFraction:n/t,tiltDegrees:n*P,bottomPx:F-n**2,dealLeadMs:I-e*L,flipLeadMs:M+(t-e)*R,waveDelayMs:e*z}}function me(e){return[[`--card-offset`,`${e.offsetPx}px`],[`--card-title-spread`,String(e.titleSpreadFraction)],[`--card-tilt`,`${e.tiltDegrees}deg`],[`--card-bottom`,`${e.bottomPx}px`],[`--card-deal-lead-ms`,`${e.dealLeadMs}ms`],[`--card-flip-lead-ms`,`${e.flipLeadMs}ms`],[`--card-wave-delay-ms`,`${e.waveDelayMs}ms`]]}function he(){return[[`--card-flip-ms`,`${M}ms`]]}var ge=`<svg viewBox="0 0 10 9" aria-hidden="true"><path d="M5 8.5C5 8.5 0 5.3 0 2.6C0 1.1 1.2 0 2.6 0C3.6 0 4.5 .6 5 1.4C5.5 .6 6.4 0 7.4 0C8.8 0 10 1.1 10 2.6C10 5.3 5 8.5 5 8.5Z"/></svg>`;function _e(n,r){let i=t(`div`,`merge-flush-deal`);e(i,me(B(r)));let a=t(`div`,`merge-flush-hop`),o=t(`div`,`merge-flush-card`),s=t(`div`,`merge-flush-face`);return s.append(t(`span`,`merge-flush-rank`,n)),s.insertAdjacentHTML(`beforeend`,ge),o.append(t(`div`,`merge-flush-back`),s),a.append(o),i.append(a),i}function ve(){let n=t(`div`,`merge-flush-table`);return e(n,he()),n.append(...j.map(_e)),n}var ye={title:`ROYAL FLUSH!`,buildScene:ve},be=[1,2,3,4],xe=14,Se=3,Ce=3,V=10,we=20,Te=2,H=28,U=18,Ee=.01,De=1.5,Oe=2200,ke=1,W=120,G=.35,Ae=15,je=105,Me=4,Ne=65,Pe=145;function Fe(e){return Math.round(e/(Math.PI*U)*360)}function K(e){return we-e*Te}function q(e){return e.rowIndex*xe+e.depthIndex*Se}function J(e,t,n){return Array.from({length:n},(r,i)=>e+(t-e)*i/(n-1))}function Y(){return be.flatMap((e,t)=>Array.from({length:e},(n,r)=>({rowIndex:t,depthIndex:e-1-r})))}function Ie(e,t){let n=y(J(Ae,je,e),t),r=y(J(Ne,Pe,e),t);return n.map((e,n)=>({angleDegrees:e+v(-4,Me,t),depthScalePercent:Math.round(r[n])}))}function Le(e,t,n){let r=v(240,380,n),i=t.angleDegrees*Math.PI/180,a=r*Math.cos(i),o=(r*Math.sin(i))**2/1560,s=v(15,45,n),c=_(o),l=_(o+s),u=c+l,d=v(540,1080,n),f=a>=0?1:-1,p=q(e);return{depthIndex:e.depthIndex,launchAngleDegrees:t.angleDegrees,distanceFromHeadPinPx:p,layer:K(e.depthIndex),flyXPx:Math.round(a*u/1e3),peakRisePx:Math.round(o),landingDropPx:s,riseMs:c,fallMs:l,flightMs:u,spinDegrees:Math.round(f*d*u/1e3),glintMs:Math.round(180/d*1e3),depthScalePercent:t.depthScalePercent,delayMs:Math.round(p/G)}}function Re(e=Math.random){let t=Y(),n=Ie(t.length,e);return t.map((t,r)=>Le(t,n[r],e))}function ze(e){return[[`--pin-left`,`${e.distanceFromHeadPinPx}px`],[`--pin-raise`,`${e.depthIndex*Ce}px`],[`--pin-shade`,`${100-e.depthIndex*12}%`],[`--pin-fly-x`,`${e.flyXPx}px`],[`--pin-peak-y`,`${-e.peakRisePx}px`],[`--pin-land-y`,`${e.landingDropPx}px`],[`--pin-rise-ms`,`${e.riseMs}ms`],[`--pin-fall-ms`,`${e.fallMs}ms`],[`--pin-flight-ms`,`${e.flightMs}ms`],[`--pin-spin`,`${e.spinDegrees}deg`],[`--pin-glint-ms`,`${e.glintMs}ms`],[`--pin-depth-scale`,`${e.depthScalePercent}%`],[`--pin-depth-shade`,`${e.depthScalePercent-10}%`],[`--pin-delay`,`${e.delayMs}ms`],[`--pin-layer`,String(e.layer)]]}function Be(){return K(De)}function Ve(){return Math.max(...Y().map(q))+V}function He(){let e=Ve(),t=H+e+U-ke;return[[`--ball-follow-px`,`${W}px`],[`--ball-follow-ms`,`${Math.round(W/G)}ms`],[`--ball-follow-spin`,`${Fe(W)}deg`],[`--ball-size`,`${U}px`],[`--ball-approach-spin`,`${Oe}deg`],[`--ball-impact-inset`,`${t}px`],[`--ball-layer`,String(Be())],[`--rack-right`,`${H}px`],[`--rack-width`,`${e}px`],[`--pin-width`,`${V}px`]]}function Ue(e=Math.random){return e()>=Ee?null:i[Math.floor(e()*i.length)].sprite}var We=`<svg viewBox="0 0 10 24" aria-hidden="true"><path class="merge-strike-pin-body" d="M5 0C7 0 7.6 2 7.2 4C6.9 5.6 6.3 6.6 6.4 8C6.6 10 9.6 12 9.6 16C9.6 19.5 8.4 22 7.6 24H2.4C1.6 22 .4 19.5 .4 16C.4 12 3.4 10 3.6 8C3.7 6.6 3.1 5.6 2.8 4C2.4 2 3 0 5 0Z"/><path class="merge-strike-pin-stripe" d="M3.1 5.2H6.9V6.2H3.1ZM3.4 7H6.6V8H3.4Z"/></svg>`;function Ge(r){let i=t(`span`,`merge-strike-pin`);return i.append(n(`span`,`merge-strike-pin-arc`,We)),e(i,ze(r)),i}function Ke(){let e=Ue();if(!e)return t(`span`,`merge-strike-ball`);let n=t(`span`,`merge-strike-ball is-animal`);return n.append(t(`span`,`nyan-sprite ${e}`)),n}function qe(){let n=t(`div`,`merge-strike-lane`);e(n,He());let r=t(`div`,`merge-strike-rack`);r.append(...Re().map(Ge));let i=t(`div`,`merge-strike-track`);return i.append(Ke()),n.append(r,i),n}var Je={title:`STRIKE!`,buildScene:qe},Ye=20,Xe=92,Ze=23,Qe=7,$e=-40;function et(){let e=_(72),t=_(69),n=780*t/1e3;return{launchHeightPx:Ye,peakHeightPx:Xe,heightThroughRimPx:Ze,heightLeavingNetPx:Qe,heightOutOfCardPx:$e,riseMs:e,fallToRimMs:t,speedThroughRimPxPerSecond:n,netCatchMs:Math.round(32/n*1e3),dropMs:_(47)}}function tt(e=et()){return[[`--ball-launch-y`,`${-e.launchHeightPx}px`],[`--ball-peak-y`,`${-e.peakHeightPx}px`],[`--ball-rim-y`,`${-e.heightThroughRimPx}px`],[`--ball-net-exit-y`,`${-e.heightLeavingNetPx}px`],[`--ball-drop-out-y`,`${-e.heightOutOfCardPx}px`],[`--ball-rise-ms`,`${e.riseMs}ms`],[`--ball-fall-to-rim-ms`,`${e.fallToRimMs}ms`],[`--ball-to-rim-ms`,`${e.riseMs+e.fallToRimMs}ms`],[`--ball-net-catch-ms`,`${e.netCatchMs}ms`],[`--ball-drop-ms`,`${e.dropMs}ms`]]}var nt=`<svg viewBox="0 0 40 48" aria-hidden="true"><rect class="merge-swish-pole" x="36" y="28" width="2" height="20"/><rect class="merge-swish-backboard" x="35" y="2" width="3" height="26" rx="1"/><path class="merge-swish-rim" d="M31 18H35M7 18A12 2.5 0 0 1 31 18"/></svg>`,rt=`<svg viewBox="0 0 40 48" aria-hidden="true"><g class="merge-swish-net"><path d="M8 18L12 32M13.5 18L15.5 32M19 18V32M24.5 18L22.5 32M30 18L26 32M9.5 23Q19 25 28.5 23M11 28Q19 29.5 27 28"/></g><path class="merge-swish-rim" d="M7 18A12 2.5 0 0 0 31 18"/></svg>`;function it(){let e=t(`div`,`merge-swish-ball-drift`),n=t(`div`,`merge-swish-ball-arc`);return n.append(t(`span`,`merge-swish-ball`)),e.append(n),e}function X(){let r=t(`div`,`merge-swish-court`);e(r,tt());let i=t(`div`,`merge-swish-track`);return i.append(it()),r.append(n(`div`,`merge-swish-hoop-back`,nt),i,n(`div`,`merge-swish-hoop-front`,rt)),r}var Z=[Je,{title:`SWISH!`,buildScene:X},fe,A,ye],at=48,Q=5600,$=null;function ot(n){let r=t(`span`,`merge-confetti-piece`),i=t(`span`,`merge-confetti-arc`);return i.append(t(`span`,`merge-confetti-paper`)),r.append(i),e(r,oe(n)),r}function st(e){let n=t(`p`,`merge-celebration-title`);return n.setAttribute(`aria-hidden`,`true`),Array.from(e).forEach((e,r)=>{let i=t(`span`,`merge-celebration-letter`,e);i.style.setProperty(`--letter-delay`,`${r*45}ms`),n.append(i)}),n}function ct(e,t,n){let r=t.firstElementChild,i=t.lastElementChild;r instanceof HTMLElement&&i instanceof HTMLElement&&(e.style.setProperty(`--celebration-title-width`,`${i.offsetLeft+i.offsetWidth-r.offsetLeft}px`),e.style.setProperty(`--celebration-title-center-y`,`${t.offsetTop+t.offsetHeight/2-n.offsetTop}px`))}function lt(e){let n=t(`div`,`merge-celebration-scene`);return n.setAttribute(`aria-hidden`,`true`),n.append(e.buildScene()),n}function ut(){return Z[Math.floor(Math.random()*Z.length)]}function dt(e){if(r())try{a(te(e))}catch{}}function ft(e){let n=t(`ul`,`merge-celebration-details`);for(let r of e)n.append(t(`li`,`merge-celebration-detail`,r));return n}function pt(e,n){let r=ut();$?.remove(),dt(n);let i=t(`div`,`merge-celebration`);i.setAttribute(`role`,`status`);let a=t(`div`,`merge-celebration-card`),o=t(`div`,`merge-celebration-stage`),s=st(r.title),c=lt(r);o.append(s,t(`p`,`merge-celebration-message`,e.message),ft(e.detailLines),c);let l=t(`div`,`merge-confetti`);l.style.setProperty(`--confetti-scale`,String(ae(n)));for(let e=0;e<at;e+=1)l.append(ot(e));a.append(l,o),i.append(a),document.body.append(i),ct(o,s,c),$=i,window.setTimeout(()=>{i.remove(),$===i&&($=null)},Q)}export{Q as CELEBRATION_DURATION_MS,pt as playCelebration};
1
+ import{_ as e,o as t,s as n}from"./dom-helpers-C7P3_59O.js";import{Qi as r,gi as i}from"./index-C2Guihrw.js";import{playToneSequence as a}from"./alert-sound-Cwoduxbr.js";var o=1.2,s=1.55,c=.12,l=523.25,u=2,d=8,f=(e,t,n)=>({semitone:e,startBeat:t,beats:n}),p={melody:[f(7,4,.5),f(11,4.5,.5),f(12,5,3)],bass:[f(-5,4,1),f(-12,5,3)]},m=[{melody:[f(0,0,1),f(4,1,1),f(7,2,1),f(9,3,1)],bass:[f(-12,0,2),f(-8,2,2)]},{melody:[f(7,0,.67),f(7,.67,.67),f(7,1.33,.67),f(9,2,1),f(5,3,1)],bass:[f(-12,0,2),f(-7,2,2)]},{melody:[f(5,0,1),f(9,1,1),f(7,2,1),f(4,3,1)],bass:[f(-7,0,2),f(-12,2,2)]},{melody:[f(12,0,.5),f(7,.5,.5),f(12,1,.5),f(16,1.5,.5),f(16,2,1),f(14,3,1)],bass:[f(-12,0,2),f(-3,2,2)]},{melody:[f(4,0,1),f(7,1,1),f(4,2,.5),f(5,2.5,.5),f(7,3,.5),f(4,3.5,.5)],bass:[f(-8,0,2),f(-12,2,2)]}].map(e=>({melody:[...e.melody,...p.melody],bass:[...e.bass,...p.bass]}));function h(e,t){return l*2**((e+t)/12)}function g(e,t){let n=(e,n,r)=>e.map(e=>({frequency:h(e.semitone,t),startSeconds:s+e.startBeat*c,durationSeconds:e.beats*c,waveform:n,gain:r}));return[...n(e.melody,`square`,.2),...n(e.melody,`triangle`,.5),...n(e.bass,`triangle`,.6)]}var ee=[{frequency:220,endFrequency:880,startSeconds:0,durationSeconds:.32,waveform:`triangle`,gain:.25},{frequency:160,endFrequency:45,startSeconds:o,durationSeconds:.28,waveform:`sine`,gain:1},{frequency:1400,endFrequency:380,startSeconds:o,durationSeconds:.06,waveform:`square`,gain:.12}];function te(e){let t=m[e%m.length],n=Math.min(e*u,d);return{peakGain:.1,tones:[...ee,...g(t,n)]}}function _(e){return Math.round(Math.sqrt(2*e/780)*1e3)}function v(e,t,n=Math.random){return Math.round(e+n()*(t-e))}function y(e,t=Math.random){let n=[...e];for(let e=n.length-1;e>0;--e){let r=Math.floor(t()*(e+1));[n[e],n[r]]=[n[r],n[e]]}return n}var ne=.6,re=.25,ie=1.6;function ae(e){return Math.min(ne+e*re,ie)}var b=[`var(--accent)`,`var(--state-running)`,`var(--state-idle)`,`var(--state-waiting)`,`var(--state-failed)`];function oe(e,t=Math.random){let n=v(320,520,t),r=v(1800,2800,t);return[[`--confetti-start-x`,`${v(4,96,t)}%`],[`--confetti-x`,`${v(-140,140,t)}px`],[`--confetti-rise`,`${-v(20,55,t)}px`],[`--confetti-fall`,`${v(45,70,t)}vh`],[`--confetti-rise-ms`,`${n}ms`],[`--confetti-fall-ms`,`${r}ms`],[`--confetti-flight-ms`,`${n+r}ms`],[`--confetti-tilt`,`${v(0,180,t)}deg`],[`--confetti-spin`,`${v(-360,360,t)}deg`],[`--confetti-flutter-ms`,`${v(160,340,t)}ms`],[`--confetti-delay`,`${v(0,160,t)}ms`],[`--confetti-color`,b[e%b.length]]]}var se=`<svg viewBox="0 0 36 36" aria-hidden="true"><circle class="merge-bullseye-ring-light" cx="18" cy="18" r="17"/><circle class="merge-bullseye-ring-red" cx="18" cy="18" r="13"/><circle class="merge-bullseye-ring-light" cx="18" cy="18" r="9"/><circle class="merge-bullseye-ring-red" cx="18" cy="18" r="5"/></svg>`,ce=`<svg viewBox="0 0 26 8" aria-hidden="true"><path class="merge-bullseye-dart-flight" d="M0 0L7 3V5L0 8L2 4Z"/><rect class="merge-bullseye-dart-shaft" x="6" y="3.3" width="8" height="1.4"/><rect class="merge-bullseye-dart-barrel" x="13" y="2.5" width="7" height="3" rx="1"/><path class="merge-bullseye-dart-tip" d="M20 3L26 4L20 5Z"/></svg>`;function le(){let e=n(`div`,`merge-bullseye-target`,se);return e.append(t(`span`,`merge-bullseye-ripple`)),e}function ue(){let e=t(`div`,`merge-bullseye-dart-drift`),r=t(`div`,`merge-bullseye-dart-arc`),i=t(`div`,`merge-bullseye-dart-aim`);return i.append(n(`div`,`merge-bullseye-dart`,ce)),r.append(i),e.append(r),e}function de(){let e=t(`div`,`merge-bullseye-range`),n=t(`div`,`merge-bullseye-track`);return n.append(ue()),e.append(le(),n),e}var fe={title:`BULLSEYE!`,buildScene:de},pe=6,x=30,S=-14,C=16;function w(e=Math.random){return[[`--crosshair-start-left`,`${v(pe,x,e)}%`],[`--crosshair-start-offset-y`,`${v(S,C,e)}px`]]}var T=`<svg viewBox="0 0 26 40" aria-hidden="true"><path class="merge-headshot-target-body" d="M9 13H17L18 16Q25 18 25 24V40H1V24Q1 18 8 16Z"/><circle class="merge-headshot-target-head" cx="13" cy="7" r="6"/><circle class="merge-headshot-target-ring" cx="13" cy="7" r="3"/><circle class="merge-headshot-target-ring" cx="13" cy="27" r="6"/><circle class="merge-headshot-target-ring" cx="13" cy="27" r="2.5"/></svg>`,E=`<svg viewBox="0 0 22 22" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="M11 0V5M11 17V22M0 11H5M17 11H22"/><circle class="merge-headshot-crosshair-dot" cx="11" cy="11" r="1"/></svg>`,D=`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 3L8 8M21 3L16 8M3 21L8 16M21 21L16 16"/></svg>`;function O(){let r=t(`div`,`merge-headshot-sweep`);e(r,w());let i=t(`div`,`merge-headshot-aim`);i.append(n(`div`,`merge-headshot-crosshair`,E));let a=t(`div`,`merge-headshot-bob`);return a.append(i,n(`div`,`merge-headshot-hitmarker`,D)),r.append(a),r}function k(){let e=t(`div`,`merge-headshot-range`),r=t(`div`,`merge-headshot-track`);return r.append(O()),e.append(n(`div`,`merge-headshot-target`,T),r),e}var A={title:`HEADSHOT!`,buildScene:k},j=[`10`,`J`,`Q`,`K`,`A`],M=160,N=19,P=5,F=9,I=780,L=70,R=70,z=35;function B(e){let t=j.length-1,n=e-t/2;return{offsetPx:n*N,titleSpreadFraction:n/t,tiltDegrees:n*P,bottomPx:F-n**2,dealLeadMs:I-e*L,flipLeadMs:M+(t-e)*R,waveDelayMs:e*z}}function me(e){return[[`--card-offset`,`${e.offsetPx}px`],[`--card-title-spread`,String(e.titleSpreadFraction)],[`--card-tilt`,`${e.tiltDegrees}deg`],[`--card-bottom`,`${e.bottomPx}px`],[`--card-deal-lead-ms`,`${e.dealLeadMs}ms`],[`--card-flip-lead-ms`,`${e.flipLeadMs}ms`],[`--card-wave-delay-ms`,`${e.waveDelayMs}ms`]]}function he(){return[[`--card-flip-ms`,`${M}ms`]]}var ge=`<svg viewBox="0 0 10 9" aria-hidden="true"><path d="M5 8.5C5 8.5 0 5.3 0 2.6C0 1.1 1.2 0 2.6 0C3.6 0 4.5 .6 5 1.4C5.5 .6 6.4 0 7.4 0C8.8 0 10 1.1 10 2.6C10 5.3 5 8.5 5 8.5Z"/></svg>`;function _e(n,r){let i=t(`div`,`merge-flush-deal`);e(i,me(B(r)));let a=t(`div`,`merge-flush-hop`),o=t(`div`,`merge-flush-card`),s=t(`div`,`merge-flush-face`);return s.append(t(`span`,`merge-flush-rank`,n)),s.insertAdjacentHTML(`beforeend`,ge),o.append(t(`div`,`merge-flush-back`),s),a.append(o),i.append(a),i}function ve(){let n=t(`div`,`merge-flush-table`);return e(n,he()),n.append(...j.map(_e)),n}var ye={title:`ROYAL FLUSH!`,buildScene:ve},be=[1,2,3,4],xe=14,Se=3,Ce=3,V=10,we=20,Te=2,H=28,U=18,Ee=.01,De=1.5,Oe=2200,ke=1,W=120,G=.35,Ae=15,je=105,Me=4,Ne=65,Pe=145;function Fe(e){return Math.round(e/(Math.PI*U)*360)}function K(e){return we-e*Te}function q(e){return e.rowIndex*xe+e.depthIndex*Se}function J(e,t,n){return Array.from({length:n},(r,i)=>e+(t-e)*i/(n-1))}function Y(){return be.flatMap((e,t)=>Array.from({length:e},(n,r)=>({rowIndex:t,depthIndex:e-1-r})))}function Ie(e,t){let n=y(J(Ae,je,e),t),r=y(J(Ne,Pe,e),t);return n.map((e,n)=>({angleDegrees:e+v(-4,Me,t),depthScalePercent:Math.round(r[n])}))}function Le(e,t,n){let r=v(240,380,n),i=t.angleDegrees*Math.PI/180,a=r*Math.cos(i),o=(r*Math.sin(i))**2/1560,s=v(15,45,n),c=_(o),l=_(o+s),u=c+l,d=v(540,1080,n),f=a>=0?1:-1,p=q(e);return{depthIndex:e.depthIndex,launchAngleDegrees:t.angleDegrees,distanceFromHeadPinPx:p,layer:K(e.depthIndex),flyXPx:Math.round(a*u/1e3),peakRisePx:Math.round(o),landingDropPx:s,riseMs:c,fallMs:l,flightMs:u,spinDegrees:Math.round(f*d*u/1e3),glintMs:Math.round(180/d*1e3),depthScalePercent:t.depthScalePercent,delayMs:Math.round(p/G)}}function Re(e=Math.random){let t=Y(),n=Ie(t.length,e);return t.map((t,r)=>Le(t,n[r],e))}function ze(e){return[[`--pin-left`,`${e.distanceFromHeadPinPx}px`],[`--pin-raise`,`${e.depthIndex*Ce}px`],[`--pin-shade`,`${100-e.depthIndex*12}%`],[`--pin-fly-x`,`${e.flyXPx}px`],[`--pin-peak-y`,`${-e.peakRisePx}px`],[`--pin-land-y`,`${e.landingDropPx}px`],[`--pin-rise-ms`,`${e.riseMs}ms`],[`--pin-fall-ms`,`${e.fallMs}ms`],[`--pin-flight-ms`,`${e.flightMs}ms`],[`--pin-spin`,`${e.spinDegrees}deg`],[`--pin-glint-ms`,`${e.glintMs}ms`],[`--pin-depth-scale`,`${e.depthScalePercent}%`],[`--pin-depth-shade`,`${e.depthScalePercent-10}%`],[`--pin-delay`,`${e.delayMs}ms`],[`--pin-layer`,String(e.layer)]]}function Be(){return K(De)}function Ve(){return Math.max(...Y().map(q))+V}function He(){let e=Ve(),t=H+e+U-ke;return[[`--ball-follow-px`,`${W}px`],[`--ball-follow-ms`,`${Math.round(W/G)}ms`],[`--ball-follow-spin`,`${Fe(W)}deg`],[`--ball-size`,`${U}px`],[`--ball-approach-spin`,`${Oe}deg`],[`--ball-impact-inset`,`${t}px`],[`--ball-layer`,String(Be())],[`--rack-right`,`${H}px`],[`--rack-width`,`${e}px`],[`--pin-width`,`${V}px`]]}function Ue(e=Math.random){return e()>=Ee?null:r[Math.floor(e()*r.length)].sprite}var We=`<svg viewBox="0 0 10 24" aria-hidden="true"><path class="merge-strike-pin-body" d="M5 0C7 0 7.6 2 7.2 4C6.9 5.6 6.3 6.6 6.4 8C6.6 10 9.6 12 9.6 16C9.6 19.5 8.4 22 7.6 24H2.4C1.6 22 .4 19.5 .4 16C.4 12 3.4 10 3.6 8C3.7 6.6 3.1 5.6 2.8 4C2.4 2 3 0 5 0Z"/><path class="merge-strike-pin-stripe" d="M3.1 5.2H6.9V6.2H3.1ZM3.4 7H6.6V8H3.4Z"/></svg>`;function Ge(r){let i=t(`span`,`merge-strike-pin`);return i.append(n(`span`,`merge-strike-pin-arc`,We)),e(i,ze(r)),i}function Ke(){let e=Ue();if(!e)return t(`span`,`merge-strike-ball`);let n=t(`span`,`merge-strike-ball is-animal`);return n.append(t(`span`,`nyan-sprite ${e}`)),n}function qe(){let n=t(`div`,`merge-strike-lane`);e(n,He());let r=t(`div`,`merge-strike-rack`);r.append(...Re().map(Ge));let i=t(`div`,`merge-strike-track`);return i.append(Ke()),n.append(r,i),n}var Je={title:`STRIKE!`,buildScene:qe},Ye=20,Xe=92,Ze=23,Qe=7,$e=-40;function et(){let e=_(72),t=_(69),n=780*t/1e3;return{launchHeightPx:Ye,peakHeightPx:Xe,heightThroughRimPx:Ze,heightLeavingNetPx:Qe,heightOutOfCardPx:$e,riseMs:e,fallToRimMs:t,speedThroughRimPxPerSecond:n,netCatchMs:Math.round(32/n*1e3),dropMs:_(47)}}function tt(e=et()){return[[`--ball-launch-y`,`${-e.launchHeightPx}px`],[`--ball-peak-y`,`${-e.peakHeightPx}px`],[`--ball-rim-y`,`${-e.heightThroughRimPx}px`],[`--ball-net-exit-y`,`${-e.heightLeavingNetPx}px`],[`--ball-drop-out-y`,`${-e.heightOutOfCardPx}px`],[`--ball-rise-ms`,`${e.riseMs}ms`],[`--ball-fall-to-rim-ms`,`${e.fallToRimMs}ms`],[`--ball-to-rim-ms`,`${e.riseMs+e.fallToRimMs}ms`],[`--ball-net-catch-ms`,`${e.netCatchMs}ms`],[`--ball-drop-ms`,`${e.dropMs}ms`]]}var nt=`<svg viewBox="0 0 40 48" aria-hidden="true"><rect class="merge-swish-pole" x="36" y="28" width="2" height="20"/><rect class="merge-swish-backboard" x="35" y="2" width="3" height="26" rx="1"/><path class="merge-swish-rim" d="M31 18H35M7 18A12 2.5 0 0 1 31 18"/></svg>`,rt=`<svg viewBox="0 0 40 48" aria-hidden="true"><g class="merge-swish-net"><path d="M8 18L12 32M13.5 18L15.5 32M19 18V32M24.5 18L22.5 32M30 18L26 32M9.5 23Q19 25 28.5 23M11 28Q19 29.5 27 28"/></g><path class="merge-swish-rim" d="M7 18A12 2.5 0 0 0 31 18"/></svg>`;function it(){let e=t(`div`,`merge-swish-ball-drift`),n=t(`div`,`merge-swish-ball-arc`);return n.append(t(`span`,`merge-swish-ball`)),e.append(n),e}function X(){let r=t(`div`,`merge-swish-court`);e(r,tt());let i=t(`div`,`merge-swish-track`);return i.append(it()),r.append(n(`div`,`merge-swish-hoop-back`,nt),i,n(`div`,`merge-swish-hoop-front`,rt)),r}var Z=[Je,{title:`SWISH!`,buildScene:X},fe,A,ye],at=48,Q=5600,$=null;function ot(n){let r=t(`span`,`merge-confetti-piece`),i=t(`span`,`merge-confetti-arc`);return i.append(t(`span`,`merge-confetti-paper`)),r.append(i),e(r,oe(n)),r}function st(e){let n=t(`p`,`merge-celebration-title`);return n.setAttribute(`aria-hidden`,`true`),Array.from(e).forEach((e,r)=>{let i=t(`span`,`merge-celebration-letter`,e);i.style.setProperty(`--letter-delay`,`${r*45}ms`),n.append(i)}),n}function ct(e,t,n){let r=t.firstElementChild,i=t.lastElementChild;r instanceof HTMLElement&&i instanceof HTMLElement&&(e.style.setProperty(`--celebration-title-width`,`${i.offsetLeft+i.offsetWidth-r.offsetLeft}px`),e.style.setProperty(`--celebration-title-center-y`,`${t.offsetTop+t.offsetHeight/2-n.offsetTop}px`))}function lt(e){let n=t(`div`,`merge-celebration-scene`);return n.setAttribute(`aria-hidden`,`true`),n.append(e.buildScene()),n}function ut(){return Z[Math.floor(Math.random()*Z.length)]}function dt(e){if(i())try{a(te(e))}catch{}}function ft(e){let n=t(`ul`,`merge-celebration-details`);for(let r of e)n.append(t(`li`,`merge-celebration-detail`,r));return n}function pt(e,n){let r=ut();$?.remove(),dt(n);let i=t(`div`,`merge-celebration`);i.setAttribute(`role`,`status`);let a=t(`div`,`merge-celebration-card`),o=t(`div`,`merge-celebration-stage`),s=st(r.title),c=lt(r);o.append(s,t(`p`,`merge-celebration-message`,e.message),ft(e.detailLines),c);let l=t(`div`,`merge-confetti`);l.style.setProperty(`--confetti-scale`,String(ae(n)));for(let e=0;e<at;e+=1)l.append(ot(e));a.append(l,o),i.append(a),document.body.append(i),ct(o,s,c),$=i,window.setTimeout(()=>{i.remove(),$===i&&($=null)},Q)}export{Q as CELEBRATION_DURATION_MS,pt as playCelebration};
@@ -1,4 +1,4 @@
1
- import{ct as e,n as t,pt as n,st as r}from"./updates-view-core-D49Cb8qb.js";var i=32,a=/^\s*at .+:\d+:\d+\)?$|^[^@\s]*@.+:\d+:\d+$/;function o(e){let t=e.stack??``,n=String(e);return(t.startsWith(n)?t.slice(n.length):t).split(`
1
+ import{ct as e,n as t,pt as n,st as r}from"./updates-view-core-Z-HI1v-s.js";var i=32,a=/^\s*at .+:\d+:\d+\)?$|^[^@\s]*@.+:\d+:\d+$/;function o(e){let t=e.stack??``,n=String(e);return(t.startsWith(n)?t.slice(n.length):t).split(`
2
2
  `).filter(e=>a.test(e)).join(`
3
3
  `)}function s(e){return e==null?null:e instanceof Error?{name:(e.name||`Error`).slice(0,128),stack:o(e).slice(0,r)}:{name:`NonError`,stack:``}}function c(e,t){let n=new Set;return(r,i)=>{n.has(r)||n.size>=t||e(i)&&n.add(r)}}function ee(e){let t=c(e,i);return e=>{let n=s(e);n&&t(`${n.name}\n${n.stack}`,{type:`client-error`,...n})}}function l(e){if(!(e instanceof Error))return`${typeof e}: ${String(e)}`;let t=o(e).split(`
4
4
  `)[0]?.trim()??``;return[`${e.name||`Error`}: ${e.message}`,t].filter(Boolean).join(` `)}function u(e){return e.slice(0,5).map(e=>`${e.path.map(String).join(`.`)||`(root)`}: ${e.message}`).join(`; `)}function te(e){return typeof e!=`object`||!e||!(`type`in e)?`(untyped)`:String(e.type)}function d(t){let n=c(t,i);return(t,r)=>{let i={scope:t.slice(0,64),text:r.slice(0,e)};n(`${i.scope}\n${i.text}`,{type:`client-log`,...i})}}var ne=6e4,f=18e5,p=20;function re({attempt:e=1,baseMs:t=ne,maxMs:n=f,retryAfterMs:r=null,random:i=Math.random,jitter:a=`full`}={}){if(typeof r==`number`&&Number.isFinite(r)&&r>0)return Math.min(r,n);let o=Math.max(0,Math.min(e,p)-1),s=Math.min(n,t*2**o);return a===`none`?s:Math.round(a===`half`?s*(.5+.5*i()):i()*s)}var m=500,h=3e4;function g(e,t=Math.random){return re({attempt:(typeof e==`number`&&Number.isFinite(e)&&e>0?Math.floor(e):0)+1,baseMs:m,maxMs:h,random:t,jitter:`half`})}function _(e){return e===`https:`?`wss:`:`ws:`}function v(e,t){return`${_(e?.protocol)}//${e.host}${t}`}var ie=1500,y=15e3,b=3e3,x=2e3,S=[{kind:`reconnect-shown-terminals`},{kind:`replace-control`}];function C(e){return e.isReplacing?{state:e,actions:[]}:{state:{...e,isReplacing:!0},actions:S}}function w(e,t,n){if(e.isProbing||e.isReplacing)return{state:e,actions:[]};let r={kind:`probe-control`,deadlineMs:t,isAnnounced:n},i=n?[{kind:`hold-input`},r]:[r];return{state:{...e,isProbing:!0},actions:i}}function T(e){return e.isVisible?[{kind:`schedule-heartbeat`,inMs:y}]:[]}function ae(e,t){switch(t.kind){case`shown`:{let n={...e,isVisible:!0};return t.hiddenForMs>1e4?C(n):w(n,ie,!0)}case`hidden`:return{state:{...e,isVisible:!1},actions:[{kind:`cancel-heartbeat`}]};case`frozen`:return{state:{...e,isFrozen:!0,isProbing:!1,isReplacing:!1},actions:[{kind:`cancel-heartbeat`},{kind:`close-sockets`}]};case`resumed`:return e.isFrozen?{state:{...e,isFrozen:!1,isReplacing:!0},actions:S}:C(e);case`network-changed`:return e.isVisible?w(e,b,!1):{state:e,actions:[]};case`heartbeat-due`:return e.isVisible?t.lateByMs>5e3?C(e):w(e,b,!1):{state:e,actions:[]};case`pong`:return e.isFrozen?{state:{...e,isProbing:!1},actions:[{kind:`release-input`}]}:{state:{...e,isProbing:!1},actions:[{kind:`release-input`},...T(e)]};case`pong-missed`:{if(e.isFrozen)return{state:{...e,isProbing:!1},actions:[{kind:`release-input`}]};let t=C({...e,isProbing:!1});return{state:t.state,actions:[...t.actions,{kind:`release-input`}]}}case`handshake-overdue`:return{state:{...e,isReplacing:!0},actions:[{kind:`replace-control`}]};case`control-opened`:return{state:{...e,isReplacing:!1},actions:T(e)};case`control-closed`:return{state:{...e,isReplacing:!1},actions:[{kind:`cancel-heartbeat`}]}}}var E=``,D=null;function O(){return E}function k(){return E?Promise.resolve(E):D||(D=fetch(`/control-token`,{credentials:`same-origin`,cache:`no-store`,signal:AbortSignal.timeout(x)}).then(e=>e.ok?e.json():null).then(e=>{let t=e?.token;return E=typeof t==`string`?t:``,E}).catch(()=>``).finally(()=>{D=null}),D)}function A(){E=``}function j(e){return E?`${e}${e.includes(`?`)?`&`:`?`}token=${encodeURIComponent(E)}`:e}var M=null,N=null,P=0,F=new Map,I=!1,L=0,R=0,z=null,B=null,V=null;function H(e){B=e}function U(e){V=e}function W(e){z=e}function G(e){return M?.readyState===WebSocket.OPEN&&(M.send(JSON.stringify(e)),!0)}var K=d(G);function q(e,t){console.warn(`[${e}] ${t}`),K(e,t)}function J(e){return R+=1,`${e}-${R}`}function Y(e,n,{timeoutMs:r=5e3}={}){let i=J(e);return new Promise((a,o)=>{let s=setTimeout(()=>{F.delete(i),o(Error(`Request timed out`))},r);F.set(i,{resolve:a,reject:o,timer:s}),M?.readyState===WebSocket.OPEN?M.send(JSON.stringify({type:e,requestId:i,...n})):(clearTimeout(s),F.delete(i),o(Error(t)))})}function oe(e){if(typeof e!=`object`||!e||!(`requestId`in e))return;let t=e.requestId;if(typeof t!=`string`)return;let n=F.get(t);n&&(clearTimeout(n.timer),F.delete(t),n.reject(Error(`The server sent a reply this dashboard could not read. Reload the page to pick up the current version.`)))}function X(e){for(let t of F.values())clearTimeout(t.timer),t.reject(Error(e));F.clear()}function Z(){N!==null&&clearTimeout(N),N=null}function Q(){let e=M;M=null,Z(),X(t),B&&B(`disconnected`,`Reconnecting`),e?.close()}function se(){Q(),P=0,$()}function ce(e,t){return t&&B&&B(`connecting`,`Connecting`),Y(`ping`,{},{timeoutMs:e}).then(()=>(t&&B&&B(`verified`,`Connected`),!0),()=>!1)}function $(){if(Z(),!O()&&!I){I=!0,k().finally(()=>{I=!1,$()});return}if(I)return;let e=L>0?`?since=${L}`:``,r=v(location,j(`/control${e}`)),i=new WebSocket(r);M=i,V?.(`connecting`);let a=!1;i.addEventListener(`open`,()=>{M===i&&(a=!0,P=0,B&&B(`connected`,`Connected`),V?.(`opened`))}),i.addEventListener(`message`,e=>{if(M!==i)return;let t;try{t=JSON.parse(e.data)}catch{q(`control`,`dropped a server message that is not JSON`);return}let r=n.safeParse(t);if(!r.success){q(`control`,`dropped ${te(t)}: ${u(r.error.issues)}`),oe(t);return}let a=r.data;if(a.type===`snapshot`&&typeof a.seq!=`number`&&(L=0),typeof a.seq==`number`){if(a.seq<=L)return;L=a.seq}let o=typeof a.requestId==`string`?a.requestId:``,s=o?F.get(o):void 0;s?(clearTimeout(s.timer),F.delete(o),s.resolve(a)):z&&z(a)}),i.addEventListener(`close`,()=>{if(M!==i)return;M=null,X(t),a||A(),B&&B(`disconnected`,`Reconnecting`),V?.(`closed`);let e=g(P);P+=1,N=setTimeout($,e)})}export{u as S,ae as _,U as a,ee as b,q as c,H as d,A as f,x as g,j as h,W as i,G as l,O as m,$ as n,ce as o,k as p,J as r,se as s,Q as t,Y as u,v,l as x,g as y};
@@ -1,4 +1,4 @@
1
- import{G as e,U as t,W as n,dt as r,ft as i,x as a}from"./updates-view-core-D49Cb8qb.js";import{h as o,m as s,o as c}from"./dom-helpers-C7P3_59O.js";import{u as l}from"./control-ws-BGxkawWT.js";import{n as u,r as d,t as f}from"./modal-Bh-cVr-I.js";import{n as p}from"./session-tick-Pvo63zK2.js";import{Br as m,Sr as h,Ur as g,Vr as _,ai as v,ii as y,m as b,oi as x,pn as S,pr as C,xr as w}from"./index-nxt6LMXr.js";import{d as T,l as E,t as D,u as ee}from"./repo-roots-adder-BuUJoPeG.js";var te=`<h2 class="dialog-title" id="add-session-title">Add Session</h2>
1
+ import{G as e,U as t,W as n,dt as r,ft as i,x as a}from"./updates-view-core-Z-HI1v-s.js";import{h as o,m as s,o as c}from"./dom-helpers-C7P3_59O.js";import{u as l}from"./control-ws-CklsyQBG.js";import{n as u,r as d,t as f}from"./modal-Bh-cVr-I.js";import{n as p}from"./session-tick-BVBhKkDl.js";import{Cn as m,Fr as h,Ir as g,Rr as _,_r as v,cr as y,ei as b,gr as x,m as S,ni as C,ti as w}from"./index-C2Guihrw.js";import{d as T,l as E,t as D,u as ee}from"./repo-roots-adder-CfQRgYuh.js";var te=`<h2 class="dialog-title" id="add-session-title">Add Session</h2>
2
2
  <fieldset class="dialog-mode-controls" aria-label="Session kind">
3
3
  <button type="button" class="dialog-mode-button" id="add-session-single-mode" aria-pressed="true">Single repo</button>
4
4
  <button type="button" class="dialog-mode-button" id="add-session-workspace-mode" aria-pressed="false">Workspace</button>
@@ -81,4 +81,4 @@ import{G as e,U as t,W as n,dt as r,ft as i,x as a}from"./updates-view-core-D49C
81
81
  <button type="button" class="btn-dialog btn-dialog-confirm" id="agent-connect-submit" hidden>Submit code</button>
82
82
  <button type="button" class="btn-dialog btn-dialog-confirm" id="agent-connect-start">Start sign-in</button>
83
83
  </div>
84
- `;function k(e,{value:t,disabled:n=!1,selected:r=!1}={}){let i=c(`option`,null,e);return t!=null&&(i.value=t),n&&(i.disabled=!0),r&&(i.selected=!0),i}function ne(e){return typeof e!=`object`||!e?!1:`saneYoloAvailable`in e&&e.saneYoloAvailable===!0}function re(e){if(typeof e!=`object`||!e||!(`coderEnvironments`in e))return[];let t=r.safeParse(e.coderEnvironments);return t.success&&t.data?t.data:[]}function ie(e){let t=Object.entries(e.parameters).map(([e,t])=>`${e}=${t}`).join(`, `);return[`Template ${e.template}.`,t?`Parameters: ${t}.`:``,e.hourlyCostUsd===null?``:`Costs $${e.hourlyCostUsd.toFixed(2)} an hour.`,`Stops after ${e.idleStopMinutes} idle minutes.`].filter(Boolean).join(` `)}var A=Object.freeze({"claude-code":`Claude Code`,codex:`Codex`});function ae(e){let t=i.safeParse(e);return t.success?t.data:null}function j(e,t){let n=A[t];return e?e.state===`signed-in`&&e.source===`host`?`${n} uses the login already on this machine.`:e.state===`signed-in`?`${n} uses the login Glimmervoid connected.`:e.state===`connecting`?e.reason??`${n} sign-in is waiting for you.`:e.state===`failed`?e.reason??`${n} sign-in failed.`:`${n} has no login on this machine, so remote ${n} sessions cannot sign in.`:`Checking whether ${n} is signed in.`}function M(){l(`get-agent-logins`,{},{timeoutMs:m}).then(e=>{e.type===`agent-logins`&&v(e.logins)}).catch(()=>{})}function oe(e){let t=A[e],{dialog:n,close:r}=d();n.innerHTML=O,f(n,`agent-connect-title`),s(n,`#agent-connect-title`).textContent=`Connect ${t}`,s(n,`#agent-connect-intro`).textContent=`Glimmervoid signs ${t} in for its own remote sessions and keeps that login in its own folder, apart from any login you already have on this machine. The sign-in runs here and is never recorded.`;let i=s(n,`#agent-connect-state`),a=s(n,`#agent-connect-steps`),c=o(n,`#agent-connect-link`,`a`),u=s(n,`#agent-connect-code-row`),p=s(n,`#agent-connect-code`),h=s(n,`#agent-connect-paste-label`),_=o(n,`#agent-connect-paste`,`input`),b=s(n,`#agent-connect-error`),S=o(n,`#agent-connect-close`,`button`),C=o(n,`#agent-connect-stop`,`button`),w=o(n,`#agent-connect-submit`,`button`),T=o(n,`#agent-connect-start`,`button`);function E(){if(!n.isConnected){ee();return}let t=y(e),r=t?.state===`connecting`;i.textContent=j(t,e),T.hidden=r,C.hidden=!r;let o=r?t.verificationUrl:null;a.hidden=o===null,c.href=o??``,c.textContent=o??``,u.hidden=!t?.userCode,p.textContent=t?.userCode??``;let s=r&&t.needsPastedCode;h.hidden=!s,w.hidden=!s}async function D(t,n,r){r.disabled=!0,b.textContent=``;try{let r=await l(t,{agent:e,...n},{timeoutMs:m});if(r.type!==`agent-logins`)return;v(r.logins),r.error&&(b.textContent=r.error)}catch(e){b.textContent=`The server did not answer (${g(e,m)}).`}finally{r.disabled=!1}}T.addEventListener(`click`,()=>{D(`agent-connect`,{action:`start`},T)}),C.addEventListener(`click`,()=>{D(`agent-connect`,{action:`cancel`},C)}),w.addEventListener(`click`,()=>{let e=_.value;_.value=``,D(`agent-connect-code`,{code:e},w)}),_.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.preventDefault(),w.click())}),S.addEventListener(`click`,r);let ee=x(E);E(),M()}function se(){let{dialog:e,close:t,actions:n,btnCancel:r}=u({title:`Set up a remote host`}),a=c(`p`,`dialog-hint`,`The setup session runs outside the guardrails so it can use your ssh keys. It runs commands on the remote host over ssh and asks before each one. Glimmervoid deletes its working folder when the session ends.`),o=c(`p`,`dialog-label`,`Agent`),s=c(`div`,`hooks-type-row`);s.setAttribute(`role`,`radiogroup`);let d=_(),f=c(`button`,`btn-dialog btn-dialog-confirm`,`Start setup`);f.type=`button`,r.type=`button`,r.addEventListener(`click`,t),n.append(f),e.append(a,o,s,d.element,n);let p=null,h=!1;function v(){if(!e.isConnected){b();return}let t=i.options.filter(e=>y(e)?.state===`signed-in`);(p===null||!t.includes(p))&&(p=t[0]??null),s.replaceChildren(...t.map(e=>{let t=c(`label`,`settings-view-toggle hooks-choice`),n=c(`input`,`settings-view-checkbox`);return n.type=`radio`,n.name=`remote-setup-agent`,n.checked=e===p,n.addEventListener(`change`,()=>{p=e}),t.append(n,c(`span`,null,A[e])),t})),t.length===0&&s.append(c(`span`,``,`Sign in to Claude Code or Codex on this machine first.`)),f.disabled=h||p===null}f.addEventListener(`click`,async()=>{if(p!==null){h=!0,f.disabled=!0,d.show(`busy`,`Starting the setup session.`);try{let e=await l(`start-remote-setup`,{agent:p},{timeoutMs:m});if(e.type===`start-remote-setup-result`&&e.ok){t();return}d.show(`error`,e.type===`start-remote-setup-result`&&e.error?e.error:`The setup session did not start.`)}catch(e){d.show(`error`,`The server did not answer (${g(e,m)}).`)}finally{h=!1,v()}}});let b=x(v);v(),M()}function ce(){let{dialog:e,close:t}=d();e.innerHTML=te,f(e,`add-session-title`);let n=o(e,`#add-session-picker`,`select`),r=s(e,`#add-session-picker-label`),i=s(e,`#add-session-workspace-list`),a=o(e,`#add-session-single-mode`,`button`),u=o(e,`#add-session-workspace-mode`,`button`),p=s(e,`#add-session-agent-label`),v=o(e,`#add-session-agent`,`select`),b=s(e,`#add-session-environment-label`),O=o(e,`#add-session-environment`,`select`),A=s(e,`#add-session-environment-hint`),se=s(e,`#add-session-agent-login`),ce=s(e,`#add-session-agent-login-text`),le=o(e,`#add-session-agent-connect`,`button`),N=s(e,`#add-session-repo-roots`),ue=s(e,`#add-session-repo-roots-title`),P=o(e,`#add-session-advanced-toggle`,`button`),F=s(e,`#add-session-advanced`),I=o(e,`#add-session-name`,`input`),L=o(e,`#add-session-path`,`input`),de=s(e,`#add-session-path-label`),R=o(e,`#add-session-skip-perms`,`input`),z=o(e,`#add-session-unguarded`,`input`),fe=o(e,`#add-session-sane-yolo-help`,`a`),pe=s(e,`#add-session-sane-yolo-unavailable`),me=o(e,`#add-session-safety-toggle`,`button`),he=s(e,`#add-session-safety`),ge=s(e,`#add-session-safety-status`),B=s(e,`#add-session-error`),_e=o(e,`#add-session-cancel`,`button`),V=o(e,`#add-session-confirm`,`button`),H=!1,ve=[],U=null;function W(e){H=e,a.setAttribute(`aria-pressed`,String(!e)),u.setAttribute(`aria-pressed`,String(e)),r.hidden=e,i.hidden=!e,P.hidden=e,P.setAttribute(`aria-expanded`,String(e)),F.hidden=!e,de.hidden=e,e&&requestAnimationFrame(()=>I.focus())}a.addEventListener(`click`,()=>W(!1)),u.addEventListener(`click`,()=>W(!0)),P.setAttribute(`aria-expanded`,`false`),P.addEventListener(`click`,()=>{let e=F.hidden;F.hidden=!e,P.setAttribute(`aria-expanded`,String(e)),e&&requestAnimationFrame(()=>I.focus())}),fe.addEventListener(`click`,()=>t()),me.addEventListener(`click`,()=>{let e=he.hidden;he.hidden=!e,me.setAttribute(`aria-expanded`,String(e))}),z.addEventListener(`change`,()=>{ge.textContent=z.checked?`guardrails off`:`guardrails on`});let ye=D({onAdded:q});N.append(ye.element);let G=_(`dialog-hint`),K=c(`button`,`btn-dialog btn-dialog-cancel`,`Scan again`);K.type=`button`,K.hidden=!0,K.addEventListener(`click`,()=>{q()});let be=c(`div`,`flex items-center gap-2`);be.append(G.element,K),N.before(be);function xe(e){n.textContent=``,n.appendChild(k(`Scan failed`,{disabled:!0,selected:!0})),i.textContent=``,G.show(`error`,`The project scan failed: ${e}`),K.hidden=!1,K.disabled=!1}function Se(e){let t=e.type===`repo-roots-scanned`;ue.textContent=t&&e.directories.length>0?`No projects in your repository roots yet`:`No repository roots yet`,ye.setSuggestions(t?e.suggestions??[]:[]),N.hidden=!1}function q(){return K.disabled=!0,G.show(`busy`,`Scanning your repository roots`),l(`scan-repo-roots`,{includeSuggestions:!0},{timeoutMs:m}).then(e=>{if(e.type===`repo-roots-scanned`&&e.error){xe(e.error);return}G.clear(),K.hidden=!0,n.textContent=``,i.textContent=``,N.hidden=!0,n.appendChild(k(`-- Select a project --`,{value:``,disabled:!0,selected:!0}));let t=!1,r=e.type===`repo-roots-scanned`?e.directories:[];for(let e of r){if(e.projects.length===0)continue;let r=c(`optgroup`);r.label=e.root;for(let n of e.projects){let e=w(n.name),a=e>0?`${n.name} (${e} open)`:n.name;r.appendChild(k(a,{value:JSON.stringify({name:n.name,path:n.path})})),i.appendChild(S(n.name,n.path)),t=!0}n.appendChild(r)}t||(n.textContent=``,n.appendChild(k(`No projects yet`,{disabled:!0,selected:!0})),i.textContent=`No projects yet.`,Se(e))}).catch(e=>{xe(g(e,m))})}q(),n.addEventListener(`change`,()=>{try{let e=JSON.parse(n.value);I.value=h(e.name),L.value=e.path}catch{}});let J=E,Y=!1;function X(e){let t=c(`p`,`dialog-hint dialog-hint-warning`,e);return t.setAttribute(`role`,`status`),B.before(t),t}function Ce(e){Y=!0,V.disabled=!0,X(e).id=`add-session-agent-guidance`}l(`list-agents`,{},{timeoutMs:m}).then(e=>{let t=ee(e);t.canSpawn||Ce(t.guidance);let n=T(e.type===`agents-listed`?e.agents:[]);if(J=n.selectedId,n.show){v.textContent=``;for(let e of n.options)v.appendChild(k(e.label,{value:e.id,selected:e.id===n.selectedId}));p.hidden=!1}}).catch(e=>{X(`Could not load the agent list (${g(e,m)}), so the session uses the default agent.`)}),v.addEventListener(`change`,()=>{J=v.value,Z()});function Z(){if(!e.isConnected){we();return}let t=ae(J),n=t?y(t):null;se.hidden=U===null||t===null||n===null||n.state===`signed-in`,ce.textContent=t?j(n,t):``}le.addEventListener(`click`,()=>{let e=ae(J);e&&oe(e)});let we=x(Z);M();let Te=!1,Ee=!1;R.addEventListener(`change`,()=>{Te=!0});function Q(){let e=Ee&&U===null;pe.hidden=e,!Te&&(R.checked=e)}l(`get-settings`,{},{timeoutMs:m}).then(e=>{e.type===`settings-error`?(X(`Could not load your settings (${e.message}). Check Sane YOLO mode yourself.`),Q()):(De(re(e.settings)),Ee=ne(e.settings),Q())}).catch(e=>{X(`Could not load your settings (${g(e,m)}). Check Sane YOLO mode yourself.`),Q()});function De(e){if(e.length!==0){ve=e,O.textContent=``,O.appendChild(k(`Local`,{value:``,selected:!0}));for(let t of e)O.appendChild(k(t.name,{value:t.name}));b.hidden=!1}}O.addEventListener(`change`,()=>{U=ve.find(e=>e.name===O.value)??null,u.hidden=U!==null,A.hidden=U===null,A.textContent=U?ie(U):``,Z(),Q(),U!==null&&H&&W(!1)}),I.addEventListener(`input`,()=>{n.selectedIndex=0}),L.addEventListener(`input`,()=>{n.selectedIndex=0});function $(){if(Y)return;let e=I.value.trim(),t=L.value.trim();if(H){let t=[...i.querySelectorAll(`input:checked`)].map(e=>e.value);if(!e||t.length<2){B.textContent=`Enter a name and select at least two repositories.`;return}let n={name:h(e),path:t[0],repos:t,dangerouslySkipPermissions:R.checked,saneYolo:R.checked,unguarded:z.checked};J&&J!==`claude-code`&&(n.agent=J),Oe(n);return}if(!e||!t){B.textContent=`Both fields are required. Select a project or use Advanced options.`;return}let n={name:h(e),path:t,dangerouslySkipPermissions:R.checked,saneYolo:R.checked,unguarded:z.checked};J&&J!==`claude-code`&&(n.agent=J),U&&(n.environment=U.name),Oe(n)}function Oe(e){V.disabled=!0,B.textContent=``,l(`add-session`,e,{timeoutMs:m}).then(e=>{e.type===`add-session-result`&&e.ok?t():B.textContent=C(e)}).catch(e=>{B.textContent=`The session was not added: ${g(e,m)}`}).finally(()=>{V.disabled=Y})}_e.addEventListener(`click`,t),V.addEventListener(`click`,$),I.addEventListener(`keydown`,e=>{e.key===`Enter`&&(H&&$(),H||L.focus())}),L.addEventListener(`keydown`,e=>{e.key===`Enter`&&$()}),requestAnimationFrame(()=>n.focus())}function le({issueId:e,issueTitle:t,format:n,content:r,message:i,error:a}){let{dialog:o,close:s,actions:l,btnCancel:d}=u({title:`Investigation report`,dialogClass:`dialog dialog-report`,cancelLabel:`Close`}),f=c(`div`,`dialog-report-meta`,t||e||``),p=null;if(n===`html`&&!a&&!i){let e=c(`iframe`,`dialog-report-frame`);e.setAttribute(`sandbox`,``),e.srcdoc=r||``,p=e}p||=c(`pre`,a?`dialog-report-body dialog-report-error`:`dialog-report-body`,a||i||r||``),o.append(f,p,l),d.addEventListener(`click`,s),requestAnimationFrame(()=>d.focus())}function N({issueTitle:r,projectLabel:i,onOpenReport:o}){let{dialog:s,close:l,actions:d,btnCancel:f}=u({title:`Investigation`,dialogClass:`dialog dialog-report`,cancelLabel:`Close`}),m=c(`div`,`dialog-report-meta`,i?`${i}: ${r}`:r),h=c(`p`,`dialog-trail-status`),g=c(`p`,`dialog-trail-summary`),_=c(`ol`,`dialog-trail-steps`),v=c(`p`,`dialog-trail-empty`,`No tool calls yet; the session is reading the issue.`),y=c(`button`,`btn-dialog btn-dialog-cancel`,`Open report`);y.type=`button`,y.hidden=!0,y.addEventListener(`click`,()=>{l(),o()}),d.prepend(y),s.append(m,h,g,_,v,d),f.addEventListener(`click`,l),requestAnimationFrame(()=>f.focus());let x=null,S=``;function C(n){let r=_.scrollHeight-_.scrollTop-_.clientHeight<24,i=t(n);if(S!==i){_.textContent=``;for(let t of e(n.steps)){let e=c(`li`,`dialog-trail-step dialog-trail-${t.kind}`),r=t.kind===`note`?t.text:`${t.stepCount} ${t.stepCount===1?`step`:`steps`}`;e.append(c(`span`,`dialog-trail-at`,a(n.startedAt,t.at)),c(`span`,`dialog-trail-detail`,r)),_.append(e)}S=i}v.hidden=n.steps.length>0||!n.inFlight,_.hidden=n.steps.length===0,r&&(_.scrollTop=_.scrollHeight)}function w(e){h.textContent=n(e,b(e.startedAt))}function T(){x&&(w(x),h.dataset.tone=x.inFlight?`live`:`done`,g.textContent=x.summaryLine,g.hidden=!x.summaryLine,y.hidden=x.inFlight||!x.verdict,C(x))}let E=p(()=>{s.isConnected?x?.inFlight&&w(x):E()});return{update(e){x=e,T()},isOpen:()=>s.isConnected,close:()=>{E(),l()}}}export{y as agentLoginOf,j as agentLoginSummary,ce as createAddSessionDialog,N as createInvestigationDialog,le as createRadarReportDialog,x as onAgentLoginsChanged,oe as openAgentConnectDialog,se as openRemoteSetupDialog};
84
+ `;function k(e,{value:t,disabled:n=!1,selected:r=!1}={}){let i=c(`option`,null,e);return t!=null&&(i.value=t),n&&(i.disabled=!0),r&&(i.selected=!0),i}function ne(e){return typeof e!=`object`||!e?!1:`saneYoloAvailable`in e&&e.saneYoloAvailable===!0}function re(e){if(typeof e!=`object`||!e||!(`coderEnvironments`in e))return[];let t=r.safeParse(e.coderEnvironments);return t.success&&t.data?t.data:[]}function ie(e){let t=Object.entries(e.parameters).map(([e,t])=>`${e}=${t}`).join(`, `);return[`Template ${e.template}.`,t?`Parameters: ${t}.`:``,e.hourlyCostUsd===null?``:`Costs $${e.hourlyCostUsd.toFixed(2)} an hour.`,`Stops after ${e.idleStopMinutes} idle minutes.`].filter(Boolean).join(` `)}var A=Object.freeze({"claude-code":`Claude Code`,codex:`Codex`});function ae(e){let t=i.safeParse(e);return t.success?t.data:null}function j(e,t){let n=A[t];return e?e.state===`signed-in`&&e.source===`host`?`${n} uses the login already on this machine.`:e.state===`signed-in`?`${n} uses the login Glimmervoid connected.`:e.state===`connecting`?e.reason??`${n} sign-in is waiting for you.`:e.state===`failed`?e.reason??`${n} sign-in failed.`:`${n} has no login on this machine, so remote ${n} sessions cannot sign in.`:`Checking whether ${n} is signed in.`}function M(){l(`get-agent-logins`,{},{timeoutMs:h}).then(e=>{e.type===`agent-logins`&&w(e.logins)}).catch(()=>{})}function oe(e){let t=A[e],{dialog:n,close:r}=d();n.innerHTML=O,f(n,`agent-connect-title`),s(n,`#agent-connect-title`).textContent=`Connect ${t}`,s(n,`#agent-connect-intro`).textContent=`Glimmervoid signs ${t} in for its own remote sessions and keeps that login in its own folder, apart from any login you already have on this machine. The sign-in runs here and is never recorded.`;let i=s(n,`#agent-connect-state`),a=s(n,`#agent-connect-steps`),c=o(n,`#agent-connect-link`,`a`),u=s(n,`#agent-connect-code-row`),p=s(n,`#agent-connect-code`),m=s(n,`#agent-connect-paste-label`),g=o(n,`#agent-connect-paste`,`input`),v=s(n,`#agent-connect-error`),y=o(n,`#agent-connect-close`,`button`),x=o(n,`#agent-connect-stop`,`button`),S=o(n,`#agent-connect-submit`,`button`),T=o(n,`#agent-connect-start`,`button`);function E(){if(!n.isConnected){ee();return}let t=b(e),r=t?.state===`connecting`;i.textContent=j(t,e),T.hidden=r,x.hidden=!r;let o=r?t.verificationUrl:null;a.hidden=o===null,c.href=o??``,c.textContent=o??``,u.hidden=!t?.userCode,p.textContent=t?.userCode??``;let s=r&&t.needsPastedCode;m.hidden=!s,S.hidden=!s}async function D(t,n,r){r.disabled=!0,v.textContent=``;try{let r=await l(t,{agent:e,...n},{timeoutMs:h});if(r.type!==`agent-logins`)return;w(r.logins),r.error&&(v.textContent=r.error)}catch(e){v.textContent=`The server did not answer (${_(e,h)}).`}finally{r.disabled=!1}}T.addEventListener(`click`,()=>{D(`agent-connect`,{action:`start`},T)}),x.addEventListener(`click`,()=>{D(`agent-connect`,{action:`cancel`},x)}),S.addEventListener(`click`,()=>{let e=g.value;g.value=``,D(`agent-connect-code`,{code:e},S)}),g.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.preventDefault(),S.click())}),y.addEventListener(`click`,r);let ee=C(E);E(),M()}function se(){let{dialog:e,close:t,actions:n,btnCancel:r}=u({title:`Set up a remote host`}),a=c(`p`,`dialog-hint`,`The setup session runs outside the guardrails so it can use your ssh keys. It runs commands on the remote host over ssh and asks before each one. Glimmervoid deletes its working folder when the session ends.`),o=c(`p`,`dialog-label`,`Agent`),s=c(`div`,`hooks-type-row`);s.setAttribute(`role`,`radiogroup`);let d=g(),f=c(`button`,`btn-dialog btn-dialog-confirm`,`Start setup`);f.type=`button`,r.type=`button`,r.addEventListener(`click`,t),n.append(f),e.append(a,o,s,d.element,n);let p=null,m=!1;function v(){if(!e.isConnected){y();return}let t=i.options.filter(e=>b(e)?.state===`signed-in`);(p===null||!t.includes(p))&&(p=t[0]??null),s.replaceChildren(...t.map(e=>{let t=c(`label`,`settings-view-toggle hooks-choice`),n=c(`input`,`settings-view-checkbox`);return n.type=`radio`,n.name=`remote-setup-agent`,n.checked=e===p,n.addEventListener(`change`,()=>{p=e}),t.append(n,c(`span`,null,A[e])),t})),t.length===0&&s.append(c(`span`,``,`Sign in to Claude Code or Codex on this machine first.`)),f.disabled=m||p===null}f.addEventListener(`click`,async()=>{if(p!==null){m=!0,f.disabled=!0,d.show(`busy`,`Starting the setup session.`);try{let e=await l(`start-remote-setup`,{agent:p},{timeoutMs:h});if(e.type===`start-remote-setup-result`&&e.ok){t();return}d.show(`error`,e.type===`start-remote-setup-result`&&e.error?e.error:`The setup session did not start.`)}catch(e){d.show(`error`,`The server did not answer (${_(e,h)}).`)}finally{m=!1,v()}}});let y=C(v);v(),M()}function ce(){let{dialog:e,close:t}=d();e.innerHTML=te,f(e,`add-session-title`);let n=o(e,`#add-session-picker`,`select`),r=s(e,`#add-session-picker-label`),i=s(e,`#add-session-workspace-list`),a=o(e,`#add-session-single-mode`,`button`),u=o(e,`#add-session-workspace-mode`,`button`),p=s(e,`#add-session-agent-label`),S=o(e,`#add-session-agent`,`select`),w=s(e,`#add-session-environment-label`),O=o(e,`#add-session-environment`,`select`),A=s(e,`#add-session-environment-hint`),se=s(e,`#add-session-agent-login`),ce=s(e,`#add-session-agent-login-text`),le=o(e,`#add-session-agent-connect`,`button`),N=s(e,`#add-session-repo-roots`),ue=s(e,`#add-session-repo-roots-title`),P=o(e,`#add-session-advanced-toggle`,`button`),F=s(e,`#add-session-advanced`),I=o(e,`#add-session-name`,`input`),L=o(e,`#add-session-path`,`input`),de=s(e,`#add-session-path-label`),R=o(e,`#add-session-skip-perms`,`input`),z=o(e,`#add-session-unguarded`,`input`),fe=o(e,`#add-session-sane-yolo-help`,`a`),pe=s(e,`#add-session-sane-yolo-unavailable`),me=o(e,`#add-session-safety-toggle`,`button`),he=s(e,`#add-session-safety`),ge=s(e,`#add-session-safety-status`),B=s(e,`#add-session-error`),_e=o(e,`#add-session-cancel`,`button`),V=o(e,`#add-session-confirm`,`button`),H=!1,ve=[],U=null;function W(e){H=e,a.setAttribute(`aria-pressed`,String(!e)),u.setAttribute(`aria-pressed`,String(e)),r.hidden=e,i.hidden=!e,P.hidden=e,P.setAttribute(`aria-expanded`,String(e)),F.hidden=!e,de.hidden=e,e&&requestAnimationFrame(()=>I.focus())}a.addEventListener(`click`,()=>W(!1)),u.addEventListener(`click`,()=>W(!0)),P.setAttribute(`aria-expanded`,`false`),P.addEventListener(`click`,()=>{let e=F.hidden;F.hidden=!e,P.setAttribute(`aria-expanded`,String(e)),e&&requestAnimationFrame(()=>I.focus())}),fe.addEventListener(`click`,()=>t()),me.addEventListener(`click`,()=>{let e=he.hidden;he.hidden=!e,me.setAttribute(`aria-expanded`,String(e))}),z.addEventListener(`change`,()=>{ge.textContent=z.checked?`guardrails off`:`guardrails on`});let ye=D({onAdded:q});N.append(ye.element);let G=g(`dialog-hint`),K=c(`button`,`btn-dialog btn-dialog-cancel`,`Scan again`);K.type=`button`,K.hidden=!0,K.addEventListener(`click`,()=>{q()});let be=c(`div`,`flex items-center gap-2`);be.append(G.element,K),N.before(be);function xe(e){n.textContent=``,n.appendChild(k(`Scan failed`,{disabled:!0,selected:!0})),i.textContent=``,G.show(`error`,`The project scan failed: ${e}`),K.hidden=!1,K.disabled=!1}function Se(e){let t=e.type===`repo-roots-scanned`;ue.textContent=t&&e.directories.length>0?`No projects in your repository roots yet`:`No repository roots yet`,ye.setSuggestions(t?e.suggestions??[]:[]),N.hidden=!1}function q(){return K.disabled=!0,G.show(`busy`,`Scanning your repository roots`),l(`scan-repo-roots`,{includeSuggestions:!0},{timeoutMs:h}).then(e=>{if(e.type===`repo-roots-scanned`&&e.error){xe(e.error);return}G.clear(),K.hidden=!0,n.textContent=``,i.textContent=``,N.hidden=!0,n.appendChild(k(`-- Select a project --`,{value:``,disabled:!0,selected:!0}));let t=!1,r=e.type===`repo-roots-scanned`?e.directories:[];for(let e of r){if(e.projects.length===0)continue;let r=c(`optgroup`);r.label=e.root;for(let n of e.projects){let e=x(n.name),a=e>0?`${n.name} (${e} open)`:n.name;r.appendChild(k(a,{value:JSON.stringify({name:n.name,path:n.path})})),i.appendChild(m(n.name,n.path)),t=!0}n.appendChild(r)}t||(n.textContent=``,n.appendChild(k(`No projects yet`,{disabled:!0,selected:!0})),i.textContent=`No projects yet.`,Se(e))}).catch(e=>{xe(_(e,h))})}q(),n.addEventListener(`change`,()=>{try{let e=JSON.parse(n.value);I.value=v(e.name),L.value=e.path}catch{}});let J=E,Y=!1;function X(e){let t=c(`p`,`dialog-hint dialog-hint-warning`,e);return t.setAttribute(`role`,`status`),B.before(t),t}function Ce(e){Y=!0,V.disabled=!0,X(e).id=`add-session-agent-guidance`}l(`list-agents`,{},{timeoutMs:h}).then(e=>{let t=ee(e);t.canSpawn||Ce(t.guidance);let n=T(e.type===`agents-listed`?e.agents:[]);if(J=n.selectedId,n.show){S.textContent=``;for(let e of n.options)S.appendChild(k(e.label,{value:e.id,selected:e.id===n.selectedId}));p.hidden=!1}}).catch(e=>{X(`Could not load the agent list (${_(e,h)}), so the session uses the default agent.`)}),S.addEventListener(`change`,()=>{J=S.value,Z()});function Z(){if(!e.isConnected){we();return}let t=ae(J),n=t?b(t):null;se.hidden=U===null||t===null||n===null||n.state===`signed-in`,ce.textContent=t?j(n,t):``}le.addEventListener(`click`,()=>{let e=ae(J);e&&oe(e)});let we=C(Z);M();let Te=!1,Ee=!1;R.addEventListener(`change`,()=>{Te=!0});function Q(){let e=Ee&&U===null;pe.hidden=e,!Te&&(R.checked=e)}l(`get-settings`,{},{timeoutMs:h}).then(e=>{e.type===`settings-error`?(X(`Could not load your settings (${e.message}). Check Sane YOLO mode yourself.`),Q()):(De(re(e.settings)),Ee=ne(e.settings),Q())}).catch(e=>{X(`Could not load your settings (${_(e,h)}). Check Sane YOLO mode yourself.`),Q()});function De(e){if(e.length!==0){ve=e,O.textContent=``,O.appendChild(k(`Local`,{value:``,selected:!0}));for(let t of e)O.appendChild(k(t.name,{value:t.name}));w.hidden=!1}}O.addEventListener(`change`,()=>{U=ve.find(e=>e.name===O.value)??null,u.hidden=U!==null,A.hidden=U===null,A.textContent=U?ie(U):``,Z(),Q(),U!==null&&H&&W(!1)}),I.addEventListener(`input`,()=>{n.selectedIndex=0}),L.addEventListener(`input`,()=>{n.selectedIndex=0});function $(){if(Y)return;let e=I.value.trim(),t=L.value.trim();if(H){let t=[...i.querySelectorAll(`input:checked`)].map(e=>e.value);if(!e||t.length<2){B.textContent=`Enter a name and select at least two repositories.`;return}let n={name:v(e),path:t[0],repos:t,dangerouslySkipPermissions:R.checked,saneYolo:R.checked,unguarded:z.checked};J&&J!==`claude-code`&&(n.agent=J),Oe(n);return}if(!e||!t){B.textContent=`Both fields are required. Select a project or use Advanced options.`;return}let n={name:v(e),path:t,dangerouslySkipPermissions:R.checked,saneYolo:R.checked,unguarded:z.checked};J&&J!==`claude-code`&&(n.agent=J),U&&(n.environment=U.name),Oe(n)}function Oe(e){V.disabled=!0,B.textContent=``,l(`add-session`,e,{timeoutMs:h}).then(e=>{e.type===`add-session-result`&&e.ok?t():B.textContent=y(e)}).catch(e=>{B.textContent=`The session was not added: ${_(e,h)}`}).finally(()=>{V.disabled=Y})}_e.addEventListener(`click`,t),V.addEventListener(`click`,$),I.addEventListener(`keydown`,e=>{e.key===`Enter`&&(H&&$(),H||L.focus())}),L.addEventListener(`keydown`,e=>{e.key===`Enter`&&$()}),requestAnimationFrame(()=>n.focus())}function le({issueId:e,issueTitle:t,format:n,content:r,message:i,error:a}){let{dialog:o,close:s,actions:l,btnCancel:d}=u({title:`Investigation report`,dialogClass:`dialog dialog-report`,cancelLabel:`Close`}),f=c(`div`,`dialog-report-meta`,t||e||``),p=null;if(n===`html`&&!a&&!i){let e=c(`iframe`,`dialog-report-frame`);e.setAttribute(`sandbox`,``),e.srcdoc=r||``,p=e}p||=c(`pre`,a?`dialog-report-body dialog-report-error`:`dialog-report-body`,a||i||r||``),o.append(f,p,l),d.addEventListener(`click`,s),requestAnimationFrame(()=>d.focus())}function N({issueTitle:r,projectLabel:i,onOpenReport:o}){let{dialog:s,close:l,actions:d,btnCancel:f}=u({title:`Investigation`,dialogClass:`dialog dialog-report`,cancelLabel:`Close`}),m=c(`div`,`dialog-report-meta`,i?`${i}: ${r}`:r),h=c(`p`,`dialog-trail-status`),g=c(`p`,`dialog-trail-summary`),_=c(`ol`,`dialog-trail-steps`),v=c(`p`,`dialog-trail-empty`,`No tool calls yet; the session is reading the issue.`),y=c(`button`,`btn-dialog btn-dialog-cancel`,`Open report`);y.type=`button`,y.hidden=!0,y.addEventListener(`click`,()=>{l(),o()}),d.prepend(y),s.append(m,h,g,_,v,d),f.addEventListener(`click`,l),requestAnimationFrame(()=>f.focus());let b=null,x=``;function C(n){let r=_.scrollHeight-_.scrollTop-_.clientHeight<24,i=t(n);if(x!==i){_.textContent=``;for(let t of e(n.steps)){let e=c(`li`,`dialog-trail-step dialog-trail-${t.kind}`),r=t.kind===`note`?t.text:`${t.stepCount} ${t.stepCount===1?`step`:`steps`}`;e.append(c(`span`,`dialog-trail-at`,a(n.startedAt,t.at)),c(`span`,`dialog-trail-detail`,r)),_.append(e)}x=i}v.hidden=n.steps.length>0||!n.inFlight,_.hidden=n.steps.length===0,r&&(_.scrollTop=_.scrollHeight)}function w(e){h.textContent=n(e,S(e.startedAt))}function T(){b&&(w(b),h.dataset.tone=b.inFlight?`live`:`done`,g.textContent=b.summaryLine,g.hidden=!b.summaryLine,y.hidden=b.inFlight||!b.verdict,C(b))}let E=p(()=>{s.isConnected?b?.inFlight&&w(b):E()});return{update(e){b=e,T()},isOpen:()=>s.isConnected,close:()=>{E(),l()}}}export{b as agentLoginOf,j as agentLoginSummary,ce as createAddSessionDialog,N as createInvestigationDialog,le as createRadarReportDialog,C as onAgentLoginsChanged,oe as openAgentConnectDialog,se as openRemoteSetupDialog};
@@ -0,0 +1 @@
1
+ import{o as e}from"./dom-helpers-C7P3_59O.js";import{u as t}from"./control-ws-CklsyQBG.js";import{a as n,r,t as i}from"./modal-Bh-cVr-I.js";import{Fr as a,Qr as o,Rr as s,pn as c}from"./index-C2Guihrw.js";import{i as l,t as u}from"./plan-render-C75HSfzz.js";var d=null;function f(t){let n=o(t.sessionId);t.select.replaceChildren(...n.map(n=>{let r=e(`option`,null,n.name);return r.value=n.path,r.selected=n.path===t.docPath,r})),t.select.hidden=n.length<2,t.title.textContent=n.find(e=>e.path===t.docPath)?.name??t.title.textContent}function p(e){let t=o(e.sessionId).some(t=>t.path===e.docPath);e.btnEdit.setAttribute(`aria-pressed`,String(e.mode===`edit`)),e.btnPreview.setAttribute(`aria-pressed`,String(e.mode===`preview`)),e.textarea.hidden=e.mode!==`edit`,e.preview.hidden=e.mode!==`preview`,e.select.disabled=e.isBusy,e.btnReload.disabled=e.isBusy||!t,e.btnSave.disabled=e.isBusy||!t||e.baseHash===null||!e.hasUnsavedChanges}function m(e,t,n=`quiet`){e.status.textContent=t,e.status.dataset.tone=n}function h(e){e.preview.replaceChildren(u(l(e.textarea.value)))}function g(e,t){n({title:e,message:`Your unsaved edits will be lost.`,confirmLabel:`Discard`,danger:!0,onConfirm:t})}function _(e,t,n){e.hasUnsavedChanges?g(t,n):n()}async function v(e,n){try{return{reply:await t(e,n,{timeoutMs:a}),failureText:null}}catch(e){return{reply:null,failureText:s(e,a)}}}async function y(e,t){e.docPath=t,e.isBusy=!0,e.baseHash=null,e.textarea.readOnly=!0,f(e),m(e,`Loading`),p(e);let{reply:n,failureText:r}=await v(`session-doc-read`,{id:e.sessionId,path:t});if(d!==e||e.docPath!==t)return;e.isBusy=!1,e.textarea.readOnly=!1;let i=n?.type===`session-doc-response`?n:null;!i?.ok||i.text===void 0||i.hash===void 0?(m(e,i?.error||r||`Could not open this doc`,`warn`),p(e)):(e.textarea.value=i.text,e.baseHash=i.hash,e.hasUnsavedChanges=!1,e.mode===`preview`&&h(e),m(e,``),p(e))}async function b(e){if(e.btnSave.disabled||e.baseHash===null)return;e.isBusy=!0,m(e,`Saving`),p(e);let t=e.docPath,n=e.textarea.value,{reply:r,failureText:i}=await v(`session-doc-save`,{id:e.sessionId,path:t,text:n,baseHash:e.baseHash});if(d!==e||e.docPath!==t)return;e.isBusy=!1;let a=r?.type===`session-doc-save-result`?r:null;!a?.ok||a.hash===void 0?(m(e,a?.conflict?`The agent changed this file since you opened it. Reload to see its version.`:a?.error||i||`Save failed`,`warn`),p(e)):(e.baseHash=a.hash,e.hasUnsavedChanges=e.textarea.value!==n,m(e,e.hasUnsavedChanges?`Unsaved changes`:`Saved`),p(e))}function x(e,t){e.mode=t,t===`preview`&&h(e),p(e),t===`edit`&&e.textarea.focus()}function S(t,n){let r=e(`button`,`plan-control ${n}`,t);return r.type=`button`,r}function C(t){let n=o(t)[0];if(!n||d)return;let a=()=>_(M,`Close this doc?`,()=>M.close()),s=r({dialogClass:`doc-editor`,closeOnBackdrop:!1,onEscape:a}),l=`doc-editor-title-${t}`,u=e(`h3`,`doc-editor-title`,n.name);u.id=l;let f=e(`select`,`plan-control doc-editor-picker`);f.setAttribute(`aria-label`,`Doc`);let h=e(`span`,`doc-editor-status`);h.setAttribute(`role`,`status`);let g=S(`Edit`,`doc-editor-mode`),v=S(`Preview`,`doc-editor-mode`),C=S(`Reload`,`doc-editor-reload`),w=S(`Save`,`doc-editor-save`),T=S(`Close`,`doc-editor-close`),E=e(`div`,`doc-editor-modes`);E.append(g,v);let D=e(`div`,`doc-editor-actions`);D.append(h,C,w,T);let O=e(`div`,`doc-editor-header`);O.append(u,f,E,D);let k=e(`textarea`,`plan-editor doc-editor-text`);k.spellcheck=!0,k.setAttribute(`aria-labelledby`,l);let A=e(`div`,`doc-editor-preview`),j=e(`div`,`doc-editor-body`);j.append(k,A),s.dialog.append(O,j),i(s.dialog,l);let M={sessionId:t,docPath:n.path,baseHash:null,hasUnsavedChanges:!1,isBusy:!1,mode:c()?`preview`:`edit`,title:u,select:f,textarea:k,preview:A,status:h,btnEdit:g,btnPreview:v,btnReload:C,btnSave:w,close:()=>{d=null,s.close()}};d=M,k.addEventListener(`input`,()=>{M.hasUnsavedChanges||(M.hasUnsavedChanges=!0,m(M,`Unsaved changes`),p(M))}),k.addEventListener(`keydown`,e=>{(e.ctrlKey||e.metaKey)&&e.key.toLowerCase()===`s`&&(e.preventDefault(),b(M))}),f.addEventListener(`change`,()=>{let e=f.value;f.value=M.docPath,_(M,`Open another doc?`,()=>{y(M,e)})}),g.addEventListener(`click`,()=>x(M,`edit`)),v.addEventListener(`click`,()=>x(M,`preview`)),C.addEventListener(`click`,()=>{_(M,`Reload this doc?`,()=>{y(M,M.docPath)})}),w.addEventListener(`click`,()=>{b(M)}),T.addEventListener(`click`,a),y(M,n.path),M.mode===`edit`&&k.focus()}function w(e){d&&d.sessionId===e&&(f(d),p(d),!o(e).some(e=>e.path===d?.docPath)&&m(d,`This doc is no longer surfaced, so it cannot be saved.`,`warn`))}export{w as applyDocsToOpenEditor,C as openDocEditor};
@@ -1 +1 @@
1
- import{o as e,y as t}from"./dom-helpers-C7P3_59O.js";import{l as n,u as r}from"./control-ws-BGxkawWT.js";import{Br as i,Ur as a,Vr as o,dr as s,hr as c,un as l}from"./index-nxt6LMXr.js";import{a as u,c as d,i as f,n as p,o as m,r as h,s as g,t as _}from"./repo-roots-adder-BuUJoPeG.js";var v=`npm install -g @anthropic-ai/claude-code`,y={done:`<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" role="img" aria-label="Done"><circle cx="12" cy="12" r="10"></circle><path d="M7.5 12.5l3 3 6-6.5"></path></svg>`,current:`<svg width="18" height="18" viewBox="0 0 24 24" role="img" aria-label="Needed"><path d="M12 3l9 9-9 9-9-9z" fill="currentColor"></path></svg>`,upcoming:`<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" role="img" aria-label="Not started"><circle cx="12" cy="12" r="10"></circle></svg>`},b=null,x=null,S=null,C=null,w={steps:h,agentSummary:``,repoRoots:[]},T=0,E=!1,D=!1,O=new Set,k=o(`first-run-load-status`),A=l();function j(e){n({type:`dashboard-telemetry`,event:`operator_action`,properties:{surface:`onboarding`,action:e}})}function M(e){for(let t of m(O,e))n({type:`dashboard-telemetry`,event:`onboarding_step`,properties:t})&&O.add(g(t))}function N({title:t,state:n,summary:r,badge:i,body:a}){let o=e(`li`,`first-run-step`);o.dataset.state=n,n===`current`&&o.setAttribute(`aria-current`,`step`);let s=e(`div`,`first-run-step-head`),c=e(`span`,`first-run-step-icon`);if(c.innerHTML=y[n],s.append(c,e(`span`,`first-run-step-title`,t)),n===`done`&&r&&s.append(e(`span`,`first-run-step-summary`,r)),n===`current`&&i&&s.append(e(`span`,`first-run-step-badge`,i)),o.append(s),n!==`current`)return o;let l=e(`div`,`first-run-step-body`);return l.append(...a()),o.append(l),o}function P(){return s()?`No supported agent is on PATH of the machine running Glimmervoid. Install Claude Code, Codex or Grok there, then rescan.`:`No supported agent is on PATH. Install Claude Code, Codex or Grok, then rescan.`}function F(){let n=e(`div`,`first-run-command-row`);if(n.append(e(`code`,`first-run-command`,v)),!navigator.clipboard?.writeText)return n;let r=e(`button`,`btn-dialog btn-dialog-cancel`,`Copy`);r.type=`button`;let i=e(`span`,`first-run-copy-status`);return i.setAttribute(`role`,`status`),r.addEventListener(`click`,async()=>{let e=t(v);i.textContent=e?await e.then(()=>`Copied`,()=>`Copy failed`):`Copy failed`}),n.append(r,i),n}function I(){let t=e(`div`,`first-run-step-actions`);S=e(`button`,`btn-dialog btn-dialog-cancel`,`Rescan`),S.type=`button`,S.addEventListener(`click`,()=>{j(`rescan`),B({rescanAgents:!0})}),t.append(S);let n=[e(`p`,`first-run-step-text`,P()),F(),t];return E?[...n,e(`p`,`first-run-step-hint`,`Still missing after a rescan? Restart Glimmervoid from a terminal where the command runs. Other terminal agents go under customAgents.`)]:n}function L(){let t=C??_({onAdded:e=>{j(e===`typed`?`add-root-typed`:`add-root-suggested`),B({rescanAgents:!1})}});return C=t,[e(`p`,`first-run-step-text`,`The folder that holds your git checkouts. Each subfolder becomes a project you can start a session in.`),t.element]}function R(){let t=e(`div`,`first-run-step-actions`),n=e(`button`,`btn-dialog btn-dialog-confirm`,`+ Session`);return n.type=`button`,n.addEventListener(`click`,()=>{j(`add-session`),c()}),t.append(n),[e(`p`,`first-run-step-text`,`Pick a project and an agent. The session runs in its own git worktree, so your checkout is never touched.`),t]}function z(){if(!x)return;let{steps:e,agentSummary:t,repoRoots:n}=w;x.replaceChildren(N({title:`1. Agent CLI`,state:e.agent,summary:t,badge:`MISSING`,body:I}),N({title:`2. Repository roots`,state:e.repoRoots,summary:n.join(`, `),badge:`NEEDED`,body:L}),N({title:`3. First session`,state:e.firstSession,summary:``,badge:``,body:R}))}async function B({rescanAgents:e}){T+=1;let t=T;S&&(S.disabled=!0);try{let[n,a]=await Promise.all([r(`list-agents`,e?{rescan:!0}:{},{timeoutMs:i}),r(`scan-repo-roots`,{includeSuggestions:!0},{timeoutMs:i})]);if(t!==T)return;let o=a.type===`repo-roots-scanned`,s=o?a.directories.map(e=>e.root):[],c=o?a.suggestions??[]:[],l=d(s,c);if(l.length>0&&!D){D=!0;let e=await p(l).catch(e=>String(e));if(t!==T)return;if(!e){B({rescanAgents:!1});return}}let m=u({agentListing:n,repoRoots:s});e&&(E=m.agent===`current`),w={steps:m,agentSummary:f(n),repoRoots:s},k.clear(),z(),M(w.steps),C?.setSuggestions(c)}catch(e){if(S&&(S.disabled=!1),t!==T)return;k.show(`error`,`The checklist could not load: ${a(e,i)} It loads again once the server answers. If it stays like this, check the terminal running Glimmervoid, or run glimmervoid doctor.`)}}function V(){if(b)return b;let t=e(`section`,`first-run-checklist`);t.setAttribute(`aria-labelledby`,`first-run-title`);let n=e(`h2`,`first-run-title`,`Get to your first session`);n.id=`first-run-title`,x=e(`ol`,`first-run-steps`);let r=e(`div`,`first-run-optional`);return r.append(e(`span`,`first-run-eyebrow`,`OPTIONAL`),A.element),t.append(e(`span`,`first-run-eyebrow`,`FIRST RUN`),n,x,k.element,r),b=t,z(),t}function H(e,t){if(!t){b?.parentElement===e&&!b.hidden&&(b.hidden=!0);return}let n=V(),r=!n.hidden&&n.parentElement===e;n.parentElement!==e&&e.append(n),n.hidden=!1,A.refresh(),r||B({rescanAgents:!1})}function U(){b&&!b.hidden&&b.isConnected&&B({rescanAgents:!1})}export{U as refreshFirstRunChecklist,H as showFirstRunChecklist};
1
+ import{o as e,y as t}from"./dom-helpers-C7P3_59O.js";import{l as n,u as r}from"./control-ws-CklsyQBG.js";import{Fr as i,Ir as a,Rr as o,bn as s,or as c,ur as l}from"./index-C2Guihrw.js";import{a as u,c as d,i as f,n as p,o as m,r as h,s as g,t as _}from"./repo-roots-adder-CfQRgYuh.js";var v=`npm install -g @anthropic-ai/claude-code`,y={done:`<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" role="img" aria-label="Done"><circle cx="12" cy="12" r="10"></circle><path d="M7.5 12.5l3 3 6-6.5"></path></svg>`,current:`<svg width="18" height="18" viewBox="0 0 24 24" role="img" aria-label="Needed"><path d="M12 3l9 9-9 9-9-9z" fill="currentColor"></path></svg>`,upcoming:`<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" role="img" aria-label="Not started"><circle cx="12" cy="12" r="10"></circle></svg>`},b=null,x=null,S=null,C=null,w={steps:h,agentSummary:``,repoRoots:[]},T=0,E=!1,D=!1,O=new Set,k=a(`first-run-load-status`),A=s();function j(e){n({type:`dashboard-telemetry`,event:`operator_action`,properties:{surface:`onboarding`,action:e}})}function M(e){for(let t of m(O,e))n({type:`dashboard-telemetry`,event:`onboarding_step`,properties:t})&&O.add(g(t))}function N({title:t,state:n,summary:r,badge:i,body:a}){let o=e(`li`,`first-run-step`);o.dataset.state=n,n===`current`&&o.setAttribute(`aria-current`,`step`);let s=e(`div`,`first-run-step-head`),c=e(`span`,`first-run-step-icon`);if(c.innerHTML=y[n],s.append(c,e(`span`,`first-run-step-title`,t)),n===`done`&&r&&s.append(e(`span`,`first-run-step-summary`,r)),n===`current`&&i&&s.append(e(`span`,`first-run-step-badge`,i)),o.append(s),n!==`current`)return o;let l=e(`div`,`first-run-step-body`);return l.append(...a()),o.append(l),o}function P(){return c()?`No supported agent is on PATH of the machine running Glimmervoid. Install Claude Code, Codex or Grok there, then rescan.`:`No supported agent is on PATH. Install Claude Code, Codex or Grok, then rescan.`}function F(){let n=e(`div`,`first-run-command-row`);if(n.append(e(`code`,`first-run-command`,v)),!navigator.clipboard?.writeText)return n;let r=e(`button`,`btn-dialog btn-dialog-cancel`,`Copy`);r.type=`button`;let i=e(`span`,`first-run-copy-status`);return i.setAttribute(`role`,`status`),r.addEventListener(`click`,async()=>{let e=t(v);i.textContent=e?await e.then(()=>`Copied`,()=>`Copy failed`):`Copy failed`}),n.append(r,i),n}function I(){let t=e(`div`,`first-run-step-actions`);S=e(`button`,`btn-dialog btn-dialog-cancel`,`Rescan`),S.type=`button`,S.addEventListener(`click`,()=>{j(`rescan`),B({rescanAgents:!0})}),t.append(S);let n=[e(`p`,`first-run-step-text`,P()),F(),t];return E?[...n,e(`p`,`first-run-step-hint`,`Still missing after a rescan? Restart Glimmervoid from a terminal where the command runs. Other terminal agents go under customAgents.`)]:n}function L(){let t=C??_({onAdded:e=>{j(e===`typed`?`add-root-typed`:`add-root-suggested`),B({rescanAgents:!1})}});return C=t,[e(`p`,`first-run-step-text`,`The folder that holds your git checkouts. Each subfolder becomes a project you can start a session in.`),t.element]}function R(){let t=e(`div`,`first-run-step-actions`),n=e(`button`,`btn-dialog btn-dialog-confirm`,`+ Session`);return n.type=`button`,n.addEventListener(`click`,()=>{j(`add-session`),l()}),t.append(n),[e(`p`,`first-run-step-text`,`Pick a project and an agent. The session runs in its own git worktree, so your checkout is never touched.`),t]}function z(){if(!x)return;let{steps:e,agentSummary:t,repoRoots:n}=w;x.replaceChildren(N({title:`1. Agent CLI`,state:e.agent,summary:t,badge:`MISSING`,body:I}),N({title:`2. Repository roots`,state:e.repoRoots,summary:n.join(`, `),badge:`NEEDED`,body:L}),N({title:`3. First session`,state:e.firstSession,summary:``,badge:``,body:R}))}async function B({rescanAgents:e}){T+=1;let t=T;S&&(S.disabled=!0);try{let[n,a]=await Promise.all([r(`list-agents`,e?{rescan:!0}:{},{timeoutMs:i}),r(`scan-repo-roots`,{includeSuggestions:!0},{timeoutMs:i})]);if(t!==T)return;let o=a.type===`repo-roots-scanned`,s=o?a.directories.map(e=>e.root):[],c=o?a.suggestions??[]:[],l=d(s,c);if(l.length>0&&!D){D=!0;let e=await p(l).catch(e=>String(e));if(t!==T)return;if(!e){B({rescanAgents:!1});return}}let m=u({agentListing:n,repoRoots:s});e&&(E=m.agent===`current`),w={steps:m,agentSummary:f(n),repoRoots:s},k.clear(),z(),M(w.steps),C?.setSuggestions(c)}catch(e){if(S&&(S.disabled=!1),t!==T)return;k.show(`error`,`The checklist could not load: ${o(e,i)} It loads again once the server answers. If it stays like this, check the terminal running Glimmervoid, or run glimmervoid doctor.`)}}function V(){if(b)return b;let t=e(`section`,`first-run-checklist`);t.setAttribute(`aria-labelledby`,`first-run-title`);let n=e(`h2`,`first-run-title`,`Get to your first session`);n.id=`first-run-title`,x=e(`ol`,`first-run-steps`);let r=e(`div`,`first-run-optional`);return r.append(e(`span`,`first-run-eyebrow`,`OPTIONAL`),A.element),t.append(e(`span`,`first-run-eyebrow`,`FIRST RUN`),n,x,k.element,r),b=t,z(),t}function H(e,t){if(!t){b?.parentElement===e&&!b.hidden&&(b.hidden=!0);return}let n=V(),r=!n.hidden&&n.parentElement===e;n.parentElement!==e&&e.append(n),n.hidden=!1,A.refresh(),r||B({rescanAgents:!1})}function U(){b&&!b.hidden&&b.isConnected&&B({rescanAgents:!1})}export{U as refreshFirstRunChecklist,H as showFirstRunChecklist};
@@ -1 +1 @@
1
- import{_ as e,a as t,f as n,l as r,m as i,n as a,r as o,u as s}from"./zod-BRLv4KqJ.js";import{n as c}from"./updates-view-core-D49Cb8qb.js";import{n as l,o as u,p as d,r as f,u as p}from"./dom-helpers-C7P3_59O.js";import{u as m}from"./control-ws-BGxkawWT.js";import{a as h}from"./modal-Bh-cVr-I.js";import{Br as g,Gt as _,Ur as v,Ut as y,Vr as ee,Wt as b}from"./index-nxt6LMXr.js";var te=n(i(),e());s({glimmervoidId:i().min(1),event:i().min(1),token:i().nullable().optional(),payload:te}),s({id:i().min(1),name:i().min(1),event:i().min(1),matcher:i().optional(),type:a([`command`,`http`]),command:i().optional(),url:i().optional(),timeout:r().int().positive().optional(),enabled:t(),projects:o(i()).optional()}).passthrough();var ne=`Claude Code hooks injected into every session Glimmervoid spawns.`,re=`Loading hooks`,ie=`No hooks yet. A hook runs a command, or calls a URL, when a Claude Code event fires in a Glimmervoid session. Start from one of these, or add your own.`,ae=`Start from`,oe=`Filter by name, event or command`,se=`Nothing matches that filter.`,ce=`Preview`,le=`The entry this becomes in the per-session settings file.`,ue=`Duplicate`,de=`Discard changes`,fe=`Close the editor and lose the unsaved changes?`,pe=`Esc cancels. Ctrl+Enter saves.`,me=4,he=`A change reaches a session at its next start or restart. Claude Code sessions only; Codex and Grok sessions do not read this file.`,ge=`Glimmervoid's own hooks`,_e=`Always present, read-only. Status detection depends on them.`,ve=`Your hooks`,ye=`New hook`,be=`Edit hook`,xe=`Saved to config.json.`,x=`All projects`,Se=`This event takes no matcher.`,Ce=`Blank uses Claude Code's default for the event.`,we=Object.freeze([{value:`command`,label:`Command`,hint:`Run a shell command. It receives the event JSON on stdin.`},{value:`http`,label:`HTTP`,hint:`POST the event JSON to a URL.`}]),Te=Object.freeze([{id:`lint`,label:`Lint after edits`,summary:`PostToolUse on Edit|Write`,draft:{name:`Lint after edits`,event:`PostToolUse`,matcher:`Edit|Write`,type:`command`,command:`npx biome check --write "$(jq -r .tool_input.file_path)"`}},{id:`notify`,label:`Notify on Stop`,summary:`Stop, command`,draft:{name:`Notify on Stop`,event:`Stop`,matcher:``,type:`command`,command:`command -v notify-send >/dev/null 2>&1 && notify-send "Claude finished a turn" || { command -v osascript >/dev/null 2>&1 && osascript -e 'display notification "Claude finished a turn" with title "Claude Code"'; }`}},{id:`guard`,label:`Guard destructive Bash`,summary:`PreToolUse on Bash, exit 2 blocks`,draft:{name:`Guard destructive Bash`,event:`PreToolUse`,matcher:`Bash`,type:`command`,command:`jq -r .tool_input.command | grep -Eq "rm -rf|git push --force" && exit 2 || exit 0`}},{id:`log`,label:`Log every prompt`,summary:`UserPromptSubmit, appends JSON`,draft:{name:`Log every prompt`,event:`UserPromptSubmit`,matcher:``,type:`command`,command:`cat >> ~/.claude/prompts.jsonl`}}]),Ee=Object.freeze({hooks:[],builtin:[],events:[]});function De(e){return!e||typeof e.error==`string`}function Oe(e){return!e||typeof e.error!=`string`?``:e.error}function S(e,t){let n=e?.[t];return Array.isArray(n)?n:Ee[t]}var C=e=>S(e,`hooks`),w=e=>S(e,`builtin`),T=e=>S(e,`events`);function E(e){let t=e?.limits?.maxTimeoutSec;return typeof t==`number`&&Number.isInteger(t)&&t>0?t:600}function ke(e){let t=C(e),n=t.filter(e=>e.enabled!==!1).length;return[{label:`yours`,value:String(t.length),tone:null},{label:`enabled`,value:String(n),tone:t.length>0&&n===0?`warn`:null},{label:`built in`,value:String(w(e).length),tone:null}]}function Ae(e,t){let n=new Map(t.map((e,t)=>[e.name,t])),r=e=>n.get(e.event)??t.length;return[...e].sort((e,t)=>{let n=r(e)-r(t);return n===0?String(e.name).localeCompare(String(t.name)):n})}function je(e,t){let n=String(t||``).trim().toLowerCase();return n?e.filter(e=>[e.name,e.event,e.matcher,e.command,e.url].some(e=>typeof e==`string`&&e.toLowerCase().includes(n))):e}function Me(e){return e.length>=me}function Ne(e){let t=[];for(let n of e){let e=t[t.length-1];e&&e.event===n.event?e.hooks.push(n):t.push({event:n.event,hooks:[n]})}return t}function Pe(e){let t=e.type===`http`?{type:`http`,url:e.url||``}:{type:`command`,command:e.command||``};Number.isInteger(e.timeout)&&Number(e.timeout)>0&&(t.timeout=e.timeout);let n=e.matcher?{matcher:e.matcher,hooks:[t]}:{hooks:[t]};return JSON.stringify({hooks:{[e.event]:[n]}},null,2)}function Fe(e){return`${e} copy`}function D(e,t){return e.find(e=>e.name===t)||null}function O(e,t){let n=D(e,t);return n?n.matcher?`Matches ${n.matcher}. Blank matches every ${n.name}.`:Se:``}function Ie(e){return e.type===`http`?e.url||``:e.command||``}function Le(e){let t=we.find(t=>t.value===e);return t?t.label:String(e||``)}function Re(e){return!Number.isInteger(e.timeout)||Number(e.timeout)<=0?``:`${e.timeout}s timeout`}function ze(e,t){let n=Array.isArray(e.projects)?e.projects:[];return n.length===0?x:n.map(e=>{let n=t.find(t=>t.id===e);return n?n.name:e}).join(`, `)}function Be(e){return e.matcher?`${e.event} / ${e.matcher}`:e.event}function Ve(e){return Be(e)}function He(e,t){let n=Array.isArray(e.projects)?e.projects:[],r=new Set(t.map(e=>e.id));return n.filter(e=>!r.has(e))}function k(e){let t=e[0];return{id:null,name:``,event:t?t.name:``,matcher:``,type:`command`,command:``,url:``,timeout:``,enabled:!0,projects:[]}}function A(e){return{id:e.id??null,name:e.name||``,event:e.event||``,matcher:e.matcher||``,type:e.type===`http`?`http`:`command`,command:e.command||``,url:e.url||``,timeout:Number.isInteger(e.timeout)?String(e.timeout):``,enabled:e.enabled!==!1,projects:Array.isArray(e.projects)?[...e.projects]:[]}}function Ue(e,t,n=600){if(!e.name.trim())return`Give the hook a name.`;let r=D(t,e.event);if(!r)return`Pick an event.`;if(e.matcher.trim()&&!r.matcher)return`${r.name} takes no matcher.`;if(e.type===`http`&&r.http===!1)return`${r.name} does not support HTTP hooks.`;if(e.type===`command`&&!e.command.trim())return`Enter the command to run.`;if(e.type===`http`&&!/^https?:\/\/\S+$/i.test(e.url.trim()))return`Enter a URL starting with http:// or https://.`;if(e.timeout.trim()!==``){let t=Number(e.timeout);if(!Number.isInteger(t)||t<1||t>n)return`Timeout must be a whole number of seconds from 1 to ${n}.`}return null}function j(e){let t={name:e.name.trim(),event:e.event,type:e.type,enabled:e.enabled!==!1};return e.id&&(t.id=e.id),e.matcher.trim()&&(t.matcher=e.matcher.trim()),e.type===`command`&&(t.command=e.command.trim()),e.type===`http`&&(t.url=e.url.trim()),e.timeout.trim()!==``&&(t.timeout=Number(e.timeout)),e.projects.length>0&&(t.projects=[...e.projects]),t}function We(e,t){let n={...k(t),...e.draft};return D(t,n.event)||(n.event=k(t).event),n}function Ge(e,t){return JSON.stringify(j(e))!==JSON.stringify(t)}function Ke(e){return{...e,enabled:e.enabled===!1}}function qe(e){return`Delete the hook "${e.name}"? Sessions already running keep it until they restart.`}var M=y(),N=null,P=null,F=null,I=null,L=null,R=null,z=!1,B=``,V=new Set,H=new Set,U=new Map,W=!1,G=(e,t)=>l(`hooks`,e,t);function K(e,t,n){let r=u(`p`,e,t);return n&&(r.dataset.tone=n),r}function q(e,t,n,r){let i=u(`button`,e,t);return i.type=`button`,r&&i.setAttribute(`aria-label`,r),i.addEventListener(`click`,n),i}async function Je(e,t){try{let n=await m(e,t,{timeoutMs:g});if((n.type===`save-hook-result`||n.type===`delete-hook-result`)&&n.ok)return null;let r=e===`save-hook`?`Could not save the hook.`:`Could not delete the hook.`;return`error`in n&&typeof n.error==`string`&&n.error?n.error:r}catch(e){return v(e,g)}}async function Ye(e,t,n,r){H.add(e),U.set(e,{tone:`busy`,text:r}),$({force:!0});let i=await Je(t,n);H.delete(e),i&&U.set(e,{tone:`error`,text:i}),i||U.delete(e),$({force:!0}),b()}function J(e,t,n){let r=u(`label`,`hooks-field`);return r.append(u(`span`,`hooks-field-label`,e),t),n&&r.append(u(`span`,`hooks-field-hint`,n)),r}function Y(e,t,n){let r=u(`input`,`settings-view-input`);return r.type=`text`,r.value=e,r.autocomplete=`off`,r.spellcheck=!1,t&&(r.placeholder=t),r.addEventListener(`input`,()=>n(r.value)),r}function Xe(e,t){let n=u(`textarea`,`settings-view-input hooks-command`);return n.rows=3,n.value=e,n.spellcheck=!1,n.addEventListener(`input`,()=>t(n.value)),n}function Ze(e,t,n){let r=u(`select`,`settings-view-input hooks-select`);for(let n of t){let t=u(`option`,null,n.name);t.value=n.name,t.title=n.description,n.name===e.event&&(t.selected=!0),r.append(t)}return r.addEventListener(`change`,()=>n(r.value)),r}function Qe(e,t){let n=u(`div`,`hooks-type-row`);n.setAttribute(`role`,`radiogroup`);for(let r of we){let i=u(`label`,`settings-view-toggle hooks-choice`),a=u(`input`,`settings-view-checkbox`);a.type=`radio`,a.name=`hooks-type`,a.value=r.value,a.checked=e.type===r.value,a.title=r.hint,a.addEventListener(`change`,()=>{a.checked&&t(r.value)}),i.append(a,u(`span`,null,r.label)),n.append(i)}return n}function $e(e,t){let n=u(`div`,`hooks-projects`);if(t.length===0)return n.append(u(`span`,`hooks-field-hint`,x)),n;let r=u(`label`,`settings-view-project-choice hooks-choice`),i=u(`input`,`settings-view-checkbox`);i.type=`checkbox`,i.checked=e.projects.length===0,r.append(i,u(`span`,null,x)),n.append(r);let a=[];for(let r of t){let t=u(`label`,`settings-view-project-choice hooks-choice`),o=u(`input`,`settings-view-checkbox`);o.type=`checkbox`,o.value=r.id,o.checked=e.projects.includes(r.id),o.addEventListener(`change`,()=>{e.projects=a.filter(e=>e.checked).map(e=>e.value),i.checked=e.projects.length===0}),a.push(o),t.append(o,u(`span`,null,r.name)),r.agent!==`claude-code`&&(t.append(u(`span`,`hooks-choice-note`,r.agent)),t.title=`Not a Claude Code project: this hook will not reach its sessions.`),n.append(t)}return i.addEventListener(`change`,()=>{if(!i.checked)i.checked=e.projects.length===0;else{for(let e of a)e.checked=!1;e.projects=[]}}),n}function et(e){let t=u(`div`,`hooks-templates`);t.append(u(`span`,`hooks-templates-label`,ae));for(let n of Te){let r=q(`hooks-chip`,n.label,()=>Z(null,We(n,e)));r.title=n.summary,t.append(r)}return t}function X(e){L&&(e?L.show(`error`,e):L.clear())}function tt(e){let t=T(M.report),n=d(M.report),r=G(e.id?be:ye,xe);r.classList.add(`hooks-editor`);let i=u(`form`,`hooks-form`);i.addEventListener(`submit`,e=>{e.preventDefault(),rt()}),i.addEventListener(`keydown`,e=>{e.key===`Escape`?(e.preventDefault(),nt()):e.key===`Enter`&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),rt())}),e.id||i.append(et(t));let a=u(`span`,`hooks-field-hint`,O(t,e.event)),o=Y(e.matcher,``,t=>{e.matcher=t}),s=J(`Command`,Xe(e.command,t=>{e.command=t}),`Runs through the shell with the event JSON on stdin. Exit 2 blocks the action where the event allows it.`),c=J(`URL`,Y(e.url,`http://127.0.0.1:8080/hook`,t=>{e.url=t}),`Claude Code POSTs the event JSON to it.`),l=()=>{s.hidden=e.type!==`command`,c.hidden=e.type!==`http`};l();let f=J(`Matcher`,o,null);f.append(a);let p=()=>{let n=t.find(t=>t.name===e.event);a.textContent=O(t,e.event),o.disabled=!!n&&!n.matcher,o.disabled&&(o.value=``,e.matcher=``)};p();let m=u(`input`,`settings-view-input hooks-timeout`);m.type=`number`,m.inputMode=`numeric`,m.min=`1`,m.max=String(E(M.report)),m.value=e.timeout,m.addEventListener(`input`,()=>{e.timeout=m.value});let h=u(`label`,`settings-view-toggle hooks-choice`),g=u(`input`,`settings-view-checkbox`);g.type=`checkbox`,g.checked=e.enabled,g.addEventListener(`change`,()=>{e.enabled=g.checked}),h.append(g,u(`span`,null,`Enabled`)),i.append(J(`Name`,Y(e.name,`Lint after edits`,t=>{e.name=t}),null),J(`Event`,Ze(e,t,t=>{e.event=t,p()}),null),f,J(`Type`,Qe(e,t=>{e.type=t,l()}),null),s,c,J(`Timeout (seconds)`,m,Ce),J(`Projects`,$e(e,n),null),J(``,h,null)),L=ee(`hooks-editor-status`);let _=u(`div`,`hooks-editor-footer`),v=u(`span`,`hooks-editor-shortcut`,pe),y=q(`btn-dialog btn-dialog-cancel`,`Cancel`,nt),b=u(`button`,`btn-dialog btn-dialog-confirm`,e.id?`Save changes`:`Add hook`);return b.type=`submit`,R=b,_.append(L.element,v,y,b),i.append(_),r.append(i),r}function Z(e,t=null){P=t||(e?A(e):k(T(M.report))),F=j(e?A(e):k(T(M.report))),I=tt(P),$({force:!0}),I.scrollIntoView({block:`nearest`});let n=I.querySelector(`input[type=text]`);n instanceof HTMLInputElement&&n.focus()}function Q(){P=null,F=null,I=null,L=null,R=null,z=!1,W=!0,$({force:!0})}function nt(){!P||!F||!Ge(P,F)?Q():h({title:de,message:fe,confirmLabel:`Discard`,danger:!0,onConfirm:Q})}async function rt(){if(!P||z)return;let e=Ue(P,T(M.report),E(M.report));if(e){X(e);return}let t=L,n=R;z=!0,t?.show(`busy`,`Saving the hook.`),n&&(n.disabled=!0);let r=await Je(`save-hook`,{hook:j(P)});z=!1,n&&(n.disabled=!1),t===L&&(r?X(r):(Q(),b()))}function it(e){let t=u(`details`,`hooks-preview`);t.open=V.has(e.id),t.addEventListener(`toggle`,()=>{t.open?V.add(e.id):V.delete(e.id)});let n=u(`summary`,`hooks-preview-summary`,ce);n.title=le;let r=u(`pre`,`hooks-preview-code`,Pe(e));return t.append(n,r),t}function at(e,{grouped:t=!1}={}){let n=d(M.report),r=u(`article`,`hooks-row`);r.setAttribute(`aria-label`,e.name),e.enabled===!1&&(r.dataset.state=`off`);let i=u(`div`,`hooks-row-main`),a=u(`div`,`hooks-row-head`);a.append(u(`span`,`hooks-row-name`,e.name));let o=t?e.matcher||``:Be(e);o&&a.append(u(`span`,`hooks-row-event`,o));let s=u(`code`,`hooks-row-target`,Ie(e));s.title=Ie(e);let c=u(`p`,`hooks-row-meta`,[Le(e.type),Re(e),ze(e,n)].filter(Boolean).join(` / `));i.append(a,s,c);let l=He(e,n);l.length>0&&i.append(K(`hooks-row-meta`,`Scoped to a project no longer in config: ${l.join(`, `)}`,`warn`)),i.append(it(e));let f=U.get(e.id);if(f){let e=ee(`hooks-row-status`);e.show(f.tone,f.text),i.append(e.element)}let p=u(`div`,`hooks-row-actions`),m=u(`label`,`settings-view-toggle hooks-choice`),g=u(`input`,`settings-view-checkbox`);g.type=`checkbox`,g.checked=e.enabled!==!1,g.disabled=H.has(e.id),g.setAttribute(`aria-label`,`${e.name} enabled`),g.addEventListener(`change`,()=>{Ye(e.id,`save-hook`,{hook:Ke(e)},g.checked?`Turning the hook on.`:`Turning the hook off.`)}),m.append(g,u(`span`,null,`On`));let _=q(`hooks-btn`,`Edit`,()=>Z(e),`Edit ${e.name}`),v=q(`hooks-btn`,ue,()=>{let t=A({...e,name:Fe(e.name)});t.id=null,Z(null,t)},`Duplicate ${e.name}`),y=q(`hooks-btn hooks-btn-danger`,`Delete`,()=>{h({title:`Delete hook`,message:qe(e),confirmLabel:`Delete`,danger:!0,onConfirm:()=>{Ye(e.id,`delete-hook`,{id:e.id},`Deleting the hook.`)}})},`Delete ${e.name}`);return y.disabled=H.has(e.id),p.append(m,_,v,y),r.append(i,p),r}function ot(e){let t=u(`article`,`hooks-row hooks-row-builtin`),n=u(`div`,`hooks-row-main`);return n.append(u(`span`,`hooks-row-event`,Ve(e)),u(`p`,`hooks-row-meta`,e.purpose)),t.append(n),t}function st(){let e=G(`Hooks`,ne),t=u(`div`,`hooks-stats`);for(let e of ke(M.report))t.append(f(`hooks`,e.label,e.value,e.tone));return e.append(t,K(`hooks-meta`,he)),e}function ct(){let e=u(`input`,`settings-view-input hooks-filter`);return e.type=`search`,e.value=B,e.placeholder=oe,e.setAttribute(`aria-label`,oe),e.addEventListener(`input`,()=>{B=e.value;let t=N?.querySelector(`.hooks-list-yours`);t&&t.replaceWith(ut())}),e}function lt(){let e=u(`div`,`hooks-empty-state`);return e.append(K(`hooks-empty`,ie),et(T(M.report))),e}function ut(){let e=u(`div`,`hooks-list-yours`),t=C(M.report);if(t.length===0)return e.append(lt()),e;let n=je(Ae(t,T(M.report)),B);if(n.length===0)return e.append(K(`hooks-empty`,se)),e;for(let t of Ne(n)){let n=u(`div`,`hooks-group`);n.append(u(`h3`,`hooks-group-title`,t.event));let r=u(`div`,`hooks-list`);for(let e of t.hooks)r.append(at(e,{grouped:!0}));n.append(r),e.append(n)}return e}function dt(){let e=G(ve,null),t=q(`hooks-btn hooks-btn-add`,`+ New hook`,()=>Z(null));t.disabled=!!P;let n=e.querySelector(`.hooks-section-head`);return n&&n.append(t),Me(C(M.report))&&e.append(ct()),e.append(ut()),e}function ft(){let e=u(`details`,`hooks-builtin`),t=u(`summary`,`hooks-builtin-summary`);t.append(u(`span`,`hooks-section-title`,`${ge} (${w(M.report).length})`),u(`span`,`hooks-section-hint`,_e));let n=u(`div`,`hooks-list`);for(let e of w(M.report))n.append(ot(e));return e.append(t,n),e}function pt(){let e=u(`div`,`hooks-content`);return M.report?De(M.report)?(e.append(K(`hooks-warning`,Oe(M.report))),e):(e.append(st()),I&&e.append(I),e.append(dt(),ft()),e):(e.append(M.hasReportSendFailed?K(`hooks-warning`,c):K(`hooks-empty`,re)),e)}function $({force:e=!1}={}){if(!N||!e&&p(N)||(M=y(),N.replaceChildren(pt()),!W))return;W=!1;let t=N.querySelector(`.hooks-btn-add`);t instanceof HTMLButtonElement&&t.focus()}function mt(e){N||(N=u(`div`,`hooks-panel`),e.append(N),_(()=>$()),$({force:!0}))}function ht(e){e===`shown`&&$({force:!0}),b()}var gt={mount:mt,refresh:ht};export{gt as view};
1
+ import{_ as e,a as t,f as n,l as r,m as i,n as a,r as o,u as s}from"./zod-BRLv4KqJ.js";import{n as c}from"./updates-view-core-Z-HI1v-s.js";import{n as l,o as u,p as d,r as f,u as p}from"./dom-helpers-C7P3_59O.js";import{u as m}from"./control-ws-CklsyQBG.js";import{a as h}from"./modal-Bh-cVr-I.js";import{Fr as g,Gt as _,Ir as ee,Rr as v,Ut as y,Wt as b}from"./index-C2Guihrw.js";var te=n(i(),e());s({glimmervoidId:i().min(1),event:i().min(1),token:i().nullable().optional(),payload:te}),s({id:i().min(1),name:i().min(1),event:i().min(1),matcher:i().optional(),type:a([`command`,`http`]),command:i().optional(),url:i().optional(),timeout:r().int().positive().optional(),enabled:t(),projects:o(i()).optional()}).passthrough();var ne=`Claude Code hooks injected into every session Glimmervoid spawns.`,re=`Loading hooks`,ie=`No hooks yet. A hook runs a command, or calls a URL, when a Claude Code event fires in a Glimmervoid session. Start from one of these, or add your own.`,ae=`Start from`,oe=`Filter by name, event or command`,se=`Nothing matches that filter.`,ce=`Preview`,le=`The entry this becomes in the per-session settings file.`,ue=`Duplicate`,de=`Discard changes`,fe=`Close the editor and lose the unsaved changes?`,pe=`Esc cancels. Ctrl+Enter saves.`,me=4,he=`A change reaches a session at its next start or restart. Claude Code sessions only; Codex and Grok sessions do not read this file.`,ge=`Glimmervoid's own hooks`,_e=`Always present, read-only. Status detection depends on them.`,ve=`Your hooks`,ye=`New hook`,be=`Edit hook`,xe=`Saved to config.json.`,x=`All projects`,Se=`This event takes no matcher.`,Ce=`Blank uses Claude Code's default for the event.`,we=Object.freeze([{value:`command`,label:`Command`,hint:`Run a shell command. It receives the event JSON on stdin.`},{value:`http`,label:`HTTP`,hint:`POST the event JSON to a URL.`}]),Te=Object.freeze([{id:`lint`,label:`Lint after edits`,summary:`PostToolUse on Edit|Write`,draft:{name:`Lint after edits`,event:`PostToolUse`,matcher:`Edit|Write`,type:`command`,command:`npx biome check --write "$(jq -r .tool_input.file_path)"`}},{id:`notify`,label:`Notify on Stop`,summary:`Stop, command`,draft:{name:`Notify on Stop`,event:`Stop`,matcher:``,type:`command`,command:`command -v notify-send >/dev/null 2>&1 && notify-send "Claude finished a turn" || { command -v osascript >/dev/null 2>&1 && osascript -e 'display notification "Claude finished a turn" with title "Claude Code"'; }`}},{id:`guard`,label:`Guard destructive Bash`,summary:`PreToolUse on Bash, exit 2 blocks`,draft:{name:`Guard destructive Bash`,event:`PreToolUse`,matcher:`Bash`,type:`command`,command:`jq -r .tool_input.command | grep -Eq "rm -rf|git push --force" && exit 2 || exit 0`}},{id:`log`,label:`Log every prompt`,summary:`UserPromptSubmit, appends JSON`,draft:{name:`Log every prompt`,event:`UserPromptSubmit`,matcher:``,type:`command`,command:`cat >> ~/.claude/prompts.jsonl`}}]),Ee=Object.freeze({hooks:[],builtin:[],events:[]});function De(e){return!e||typeof e.error==`string`}function Oe(e){return!e||typeof e.error!=`string`?``:e.error}function S(e,t){let n=e?.[t];return Array.isArray(n)?n:Ee[t]}var C=e=>S(e,`hooks`),w=e=>S(e,`builtin`),T=e=>S(e,`events`);function E(e){let t=e?.limits?.maxTimeoutSec;return typeof t==`number`&&Number.isInteger(t)&&t>0?t:600}function ke(e){let t=C(e),n=t.filter(e=>e.enabled!==!1).length;return[{label:`yours`,value:String(t.length),tone:null},{label:`enabled`,value:String(n),tone:t.length>0&&n===0?`warn`:null},{label:`built in`,value:String(w(e).length),tone:null}]}function Ae(e,t){let n=new Map(t.map((e,t)=>[e.name,t])),r=e=>n.get(e.event)??t.length;return[...e].sort((e,t)=>{let n=r(e)-r(t);return n===0?String(e.name).localeCompare(String(t.name)):n})}function je(e,t){let n=String(t||``).trim().toLowerCase();return n?e.filter(e=>[e.name,e.event,e.matcher,e.command,e.url].some(e=>typeof e==`string`&&e.toLowerCase().includes(n))):e}function Me(e){return e.length>=me}function Ne(e){let t=[];for(let n of e){let e=t[t.length-1];e&&e.event===n.event?e.hooks.push(n):t.push({event:n.event,hooks:[n]})}return t}function Pe(e){let t=e.type===`http`?{type:`http`,url:e.url||``}:{type:`command`,command:e.command||``};Number.isInteger(e.timeout)&&Number(e.timeout)>0&&(t.timeout=e.timeout);let n=e.matcher?{matcher:e.matcher,hooks:[t]}:{hooks:[t]};return JSON.stringify({hooks:{[e.event]:[n]}},null,2)}function Fe(e){return`${e} copy`}function D(e,t){return e.find(e=>e.name===t)||null}function O(e,t){let n=D(e,t);return n?n.matcher?`Matches ${n.matcher}. Blank matches every ${n.name}.`:Se:``}function Ie(e){return e.type===`http`?e.url||``:e.command||``}function Le(e){let t=we.find(t=>t.value===e);return t?t.label:String(e||``)}function Re(e){return!Number.isInteger(e.timeout)||Number(e.timeout)<=0?``:`${e.timeout}s timeout`}function ze(e,t){let n=Array.isArray(e.projects)?e.projects:[];return n.length===0?x:n.map(e=>{let n=t.find(t=>t.id===e);return n?n.name:e}).join(`, `)}function Be(e){return e.matcher?`${e.event} / ${e.matcher}`:e.event}function Ve(e){return Be(e)}function He(e,t){let n=Array.isArray(e.projects)?e.projects:[],r=new Set(t.map(e=>e.id));return n.filter(e=>!r.has(e))}function k(e){let t=e[0];return{id:null,name:``,event:t?t.name:``,matcher:``,type:`command`,command:``,url:``,timeout:``,enabled:!0,projects:[]}}function A(e){return{id:e.id??null,name:e.name||``,event:e.event||``,matcher:e.matcher||``,type:e.type===`http`?`http`:`command`,command:e.command||``,url:e.url||``,timeout:Number.isInteger(e.timeout)?String(e.timeout):``,enabled:e.enabled!==!1,projects:Array.isArray(e.projects)?[...e.projects]:[]}}function Ue(e,t,n=600){if(!e.name.trim())return`Give the hook a name.`;let r=D(t,e.event);if(!r)return`Pick an event.`;if(e.matcher.trim()&&!r.matcher)return`${r.name} takes no matcher.`;if(e.type===`http`&&r.http===!1)return`${r.name} does not support HTTP hooks.`;if(e.type===`command`&&!e.command.trim())return`Enter the command to run.`;if(e.type===`http`&&!/^https?:\/\/\S+$/i.test(e.url.trim()))return`Enter a URL starting with http:// or https://.`;if(e.timeout.trim()!==``){let t=Number(e.timeout);if(!Number.isInteger(t)||t<1||t>n)return`Timeout must be a whole number of seconds from 1 to ${n}.`}return null}function j(e){let t={name:e.name.trim(),event:e.event,type:e.type,enabled:e.enabled!==!1};return e.id&&(t.id=e.id),e.matcher.trim()&&(t.matcher=e.matcher.trim()),e.type===`command`&&(t.command=e.command.trim()),e.type===`http`&&(t.url=e.url.trim()),e.timeout.trim()!==``&&(t.timeout=Number(e.timeout)),e.projects.length>0&&(t.projects=[...e.projects]),t}function We(e,t){let n={...k(t),...e.draft};return D(t,n.event)||(n.event=k(t).event),n}function Ge(e,t){return JSON.stringify(j(e))!==JSON.stringify(t)}function Ke(e){return{...e,enabled:e.enabled===!1}}function qe(e){return`Delete the hook "${e.name}"? Sessions already running keep it until they restart.`}var M=y(),N=null,P=null,F=null,I=null,L=null,R=null,z=!1,B=``,V=new Set,H=new Set,U=new Map,W=!1,G=(e,t)=>l(`hooks`,e,t);function K(e,t,n){let r=u(`p`,e,t);return n&&(r.dataset.tone=n),r}function q(e,t,n,r){let i=u(`button`,e,t);return i.type=`button`,r&&i.setAttribute(`aria-label`,r),i.addEventListener(`click`,n),i}async function Je(e,t){try{let n=await m(e,t,{timeoutMs:g});if((n.type===`save-hook-result`||n.type===`delete-hook-result`)&&n.ok)return null;let r=e===`save-hook`?`Could not save the hook.`:`Could not delete the hook.`;return`error`in n&&typeof n.error==`string`&&n.error?n.error:r}catch(e){return v(e,g)}}async function Ye(e,t,n,r){H.add(e),U.set(e,{tone:`busy`,text:r}),$({force:!0});let i=await Je(t,n);H.delete(e),i&&U.set(e,{tone:`error`,text:i}),i||U.delete(e),$({force:!0}),b()}function J(e,t,n){let r=u(`label`,`hooks-field`);return r.append(u(`span`,`hooks-field-label`,e),t),n&&r.append(u(`span`,`hooks-field-hint`,n)),r}function Y(e,t,n){let r=u(`input`,`settings-view-input`);return r.type=`text`,r.value=e,r.autocomplete=`off`,r.spellcheck=!1,t&&(r.placeholder=t),r.addEventListener(`input`,()=>n(r.value)),r}function Xe(e,t){let n=u(`textarea`,`settings-view-input hooks-command`);return n.rows=3,n.value=e,n.spellcheck=!1,n.addEventListener(`input`,()=>t(n.value)),n}function Ze(e,t,n){let r=u(`select`,`settings-view-input hooks-select`);for(let n of t){let t=u(`option`,null,n.name);t.value=n.name,t.title=n.description,n.name===e.event&&(t.selected=!0),r.append(t)}return r.addEventListener(`change`,()=>n(r.value)),r}function Qe(e,t){let n=u(`div`,`hooks-type-row`);n.setAttribute(`role`,`radiogroup`);for(let r of we){let i=u(`label`,`settings-view-toggle hooks-choice`),a=u(`input`,`settings-view-checkbox`);a.type=`radio`,a.name=`hooks-type`,a.value=r.value,a.checked=e.type===r.value,a.title=r.hint,a.addEventListener(`change`,()=>{a.checked&&t(r.value)}),i.append(a,u(`span`,null,r.label)),n.append(i)}return n}function $e(e,t){let n=u(`div`,`hooks-projects`);if(t.length===0)return n.append(u(`span`,`hooks-field-hint`,x)),n;let r=u(`label`,`settings-view-project-choice hooks-choice`),i=u(`input`,`settings-view-checkbox`);i.type=`checkbox`,i.checked=e.projects.length===0,r.append(i,u(`span`,null,x)),n.append(r);let a=[];for(let r of t){let t=u(`label`,`settings-view-project-choice hooks-choice`),o=u(`input`,`settings-view-checkbox`);o.type=`checkbox`,o.value=r.id,o.checked=e.projects.includes(r.id),o.addEventListener(`change`,()=>{e.projects=a.filter(e=>e.checked).map(e=>e.value),i.checked=e.projects.length===0}),a.push(o),t.append(o,u(`span`,null,r.name)),r.agent!==`claude-code`&&(t.append(u(`span`,`hooks-choice-note`,r.agent)),t.title=`Not a Claude Code project: this hook will not reach its sessions.`),n.append(t)}return i.addEventListener(`change`,()=>{if(!i.checked)i.checked=e.projects.length===0;else{for(let e of a)e.checked=!1;e.projects=[]}}),n}function et(e){let t=u(`div`,`hooks-templates`);t.append(u(`span`,`hooks-templates-label`,ae));for(let n of Te){let r=q(`hooks-chip`,n.label,()=>Z(null,We(n,e)));r.title=n.summary,t.append(r)}return t}function X(e){L&&(e?L.show(`error`,e):L.clear())}function tt(e){let t=T(M.report),n=d(M.report),r=G(e.id?be:ye,xe);r.classList.add(`hooks-editor`);let i=u(`form`,`hooks-form`);i.addEventListener(`submit`,e=>{e.preventDefault(),rt()}),i.addEventListener(`keydown`,e=>{e.key===`Escape`?(e.preventDefault(),nt()):e.key===`Enter`&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),rt())}),e.id||i.append(et(t));let a=u(`span`,`hooks-field-hint`,O(t,e.event)),o=Y(e.matcher,``,t=>{e.matcher=t}),s=J(`Command`,Xe(e.command,t=>{e.command=t}),`Runs through the shell with the event JSON on stdin. Exit 2 blocks the action where the event allows it.`),c=J(`URL`,Y(e.url,`http://127.0.0.1:8080/hook`,t=>{e.url=t}),`Claude Code POSTs the event JSON to it.`),l=()=>{s.hidden=e.type!==`command`,c.hidden=e.type!==`http`};l();let f=J(`Matcher`,o,null);f.append(a);let p=()=>{let n=t.find(t=>t.name===e.event);a.textContent=O(t,e.event),o.disabled=!!n&&!n.matcher,o.disabled&&(o.value=``,e.matcher=``)};p();let m=u(`input`,`settings-view-input hooks-timeout`);m.type=`number`,m.inputMode=`numeric`,m.min=`1`,m.max=String(E(M.report)),m.value=e.timeout,m.addEventListener(`input`,()=>{e.timeout=m.value});let h=u(`label`,`settings-view-toggle hooks-choice`),g=u(`input`,`settings-view-checkbox`);g.type=`checkbox`,g.checked=e.enabled,g.addEventListener(`change`,()=>{e.enabled=g.checked}),h.append(g,u(`span`,null,`Enabled`)),i.append(J(`Name`,Y(e.name,`Lint after edits`,t=>{e.name=t}),null),J(`Event`,Ze(e,t,t=>{e.event=t,p()}),null),f,J(`Type`,Qe(e,t=>{e.type=t,l()}),null),s,c,J(`Timeout (seconds)`,m,Ce),J(`Projects`,$e(e,n),null),J(``,h,null)),L=ee(`hooks-editor-status`);let _=u(`div`,`hooks-editor-footer`),v=u(`span`,`hooks-editor-shortcut`,pe),y=q(`btn-dialog btn-dialog-cancel`,`Cancel`,nt),b=u(`button`,`btn-dialog btn-dialog-confirm`,e.id?`Save changes`:`Add hook`);return b.type=`submit`,R=b,_.append(L.element,v,y,b),i.append(_),r.append(i),r}function Z(e,t=null){P=t||(e?A(e):k(T(M.report))),F=j(e?A(e):k(T(M.report))),I=tt(P),$({force:!0}),I.scrollIntoView({block:`nearest`});let n=I.querySelector(`input[type=text]`);n instanceof HTMLInputElement&&n.focus()}function Q(){P=null,F=null,I=null,L=null,R=null,z=!1,W=!0,$({force:!0})}function nt(){!P||!F||!Ge(P,F)?Q():h({title:de,message:fe,confirmLabel:`Discard`,danger:!0,onConfirm:Q})}async function rt(){if(!P||z)return;let e=Ue(P,T(M.report),E(M.report));if(e){X(e);return}let t=L,n=R;z=!0,t?.show(`busy`,`Saving the hook.`),n&&(n.disabled=!0);let r=await Je(`save-hook`,{hook:j(P)});z=!1,n&&(n.disabled=!1),t===L&&(r?X(r):(Q(),b()))}function it(e){let t=u(`details`,`hooks-preview`);t.open=V.has(e.id),t.addEventListener(`toggle`,()=>{t.open?V.add(e.id):V.delete(e.id)});let n=u(`summary`,`hooks-preview-summary`,ce);n.title=le;let r=u(`pre`,`hooks-preview-code`,Pe(e));return t.append(n,r),t}function at(e,{grouped:t=!1}={}){let n=d(M.report),r=u(`article`,`hooks-row`);r.setAttribute(`aria-label`,e.name),e.enabled===!1&&(r.dataset.state=`off`);let i=u(`div`,`hooks-row-main`),a=u(`div`,`hooks-row-head`);a.append(u(`span`,`hooks-row-name`,e.name));let o=t?e.matcher||``:Be(e);o&&a.append(u(`span`,`hooks-row-event`,o));let s=u(`code`,`hooks-row-target`,Ie(e));s.title=Ie(e);let c=u(`p`,`hooks-row-meta`,[Le(e.type),Re(e),ze(e,n)].filter(Boolean).join(` / `));i.append(a,s,c);let l=He(e,n);l.length>0&&i.append(K(`hooks-row-meta`,`Scoped to a project no longer in config: ${l.join(`, `)}`,`warn`)),i.append(it(e));let f=U.get(e.id);if(f){let e=ee(`hooks-row-status`);e.show(f.tone,f.text),i.append(e.element)}let p=u(`div`,`hooks-row-actions`),m=u(`label`,`settings-view-toggle hooks-choice`),g=u(`input`,`settings-view-checkbox`);g.type=`checkbox`,g.checked=e.enabled!==!1,g.disabled=H.has(e.id),g.setAttribute(`aria-label`,`${e.name} enabled`),g.addEventListener(`change`,()=>{Ye(e.id,`save-hook`,{hook:Ke(e)},g.checked?`Turning the hook on.`:`Turning the hook off.`)}),m.append(g,u(`span`,null,`On`));let _=q(`hooks-btn`,`Edit`,()=>Z(e),`Edit ${e.name}`),v=q(`hooks-btn`,ue,()=>{let t=A({...e,name:Fe(e.name)});t.id=null,Z(null,t)},`Duplicate ${e.name}`),y=q(`hooks-btn hooks-btn-danger`,`Delete`,()=>{h({title:`Delete hook`,message:qe(e),confirmLabel:`Delete`,danger:!0,onConfirm:()=>{Ye(e.id,`delete-hook`,{id:e.id},`Deleting the hook.`)}})},`Delete ${e.name}`);return y.disabled=H.has(e.id),p.append(m,_,v,y),r.append(i,p),r}function ot(e){let t=u(`article`,`hooks-row hooks-row-builtin`),n=u(`div`,`hooks-row-main`);return n.append(u(`span`,`hooks-row-event`,Ve(e)),u(`p`,`hooks-row-meta`,e.purpose)),t.append(n),t}function st(){let e=G(`Hooks`,ne),t=u(`div`,`hooks-stats`);for(let e of ke(M.report))t.append(f(`hooks`,e.label,e.value,e.tone));return e.append(t,K(`hooks-meta`,he)),e}function ct(){let e=u(`input`,`settings-view-input hooks-filter`);return e.type=`search`,e.value=B,e.placeholder=oe,e.setAttribute(`aria-label`,oe),e.addEventListener(`input`,()=>{B=e.value;let t=N?.querySelector(`.hooks-list-yours`);t&&t.replaceWith(ut())}),e}function lt(){let e=u(`div`,`hooks-empty-state`);return e.append(K(`hooks-empty`,ie),et(T(M.report))),e}function ut(){let e=u(`div`,`hooks-list-yours`),t=C(M.report);if(t.length===0)return e.append(lt()),e;let n=je(Ae(t,T(M.report)),B);if(n.length===0)return e.append(K(`hooks-empty`,se)),e;for(let t of Ne(n)){let n=u(`div`,`hooks-group`);n.append(u(`h3`,`hooks-group-title`,t.event));let r=u(`div`,`hooks-list`);for(let e of t.hooks)r.append(at(e,{grouped:!0}));n.append(r),e.append(n)}return e}function dt(){let e=G(ve,null),t=q(`hooks-btn hooks-btn-add`,`+ New hook`,()=>Z(null));t.disabled=!!P;let n=e.querySelector(`.hooks-section-head`);return n&&n.append(t),Me(C(M.report))&&e.append(ct()),e.append(ut()),e}function ft(){let e=u(`details`,`hooks-builtin`),t=u(`summary`,`hooks-builtin-summary`);t.append(u(`span`,`hooks-section-title`,`${ge} (${w(M.report).length})`),u(`span`,`hooks-section-hint`,_e));let n=u(`div`,`hooks-list`);for(let e of w(M.report))n.append(ot(e));return e.append(t,n),e}function pt(){let e=u(`div`,`hooks-content`);return M.report?De(M.report)?(e.append(K(`hooks-warning`,Oe(M.report))),e):(e.append(st()),I&&e.append(I),e.append(dt(),ft()),e):(e.append(M.hasReportSendFailed?K(`hooks-warning`,c):K(`hooks-empty`,re)),e)}function $({force:e=!1}={}){if(!N||!e&&p(N)||(M=y(),N.replaceChildren(pt()),!W))return;W=!1;let t=N.querySelector(`.hooks-btn-add`);t instanceof HTMLButtonElement&&t.focus()}function mt(e){N||(N=u(`div`,`hooks-panel`),e.append(N),_(()=>$()),$({force:!0}))}function ht(e){e===`shown`&&$({force:!0}),b()}var gt={mount:mt,refresh:ht};export{gt as view};