glimmervoid 0.45.0 → 0.45.1-next.45

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 (110) hide show
  1. package/dist/bin/glimmervoid.js +15 -15
  2. package/dist/chunks/{adapters-D99c4zCx.js → adapters-BE9BKVW0.js} +24 -24
  3. package/dist/chunks/{adapters-BGuI5U_-.js → adapters-CPaysZkO.js} +1 -1
  4. package/dist/chunks/{agent-api-cli-DdrR2vnB.js → agent-api-cli-B0l8uLos.js} +1 -1
  5. package/dist/chunks/{agent-api-cli-DIGH1v3_.js → agent-api-cli-Bq9J0_D5.js} +148 -15
  6. package/dist/chunks/{agent-api-core-D49OzKho.js → agent-api-core-ClU9-5K3.js} +9 -3
  7. package/dist/chunks/{agent-setup-cli-7hG401Io.js → agent-setup-cli-BA_1AdhQ.js} +2 -2
  8. package/dist/chunks/{contracts-CucdticH.js → build-channel-qgKwNssc.js} +37 -3
  9. package/dist/chunks/{config-BLeRKmn9.js → config-BqJTnPae.js} +16 -33
  10. package/dist/chunks/{config-path-core-DFt-TemS.js → config-path-core-DUWk0Lui.js} +5 -1
  11. package/dist/chunks/config-store-5xpRLHFo.js +1 -0
  12. package/dist/chunks/{config-store-CXLnauAa.js → config-store-BGTg8oKO.js} +77 -78
  13. package/dist/chunks/{git-version-C3lznLS_.js → git-version-BpdkKH2j.js} +1 -1
  14. package/dist/chunks/{grok-Di4aQGre.js → grok-7jK8ZNtf.js} +1 -1
  15. package/dist/chunks/{json-file-DFCTvPjj.js → json-file-BjFK_eSH.js} +2 -7
  16. package/dist/chunks/{main-CX9CkTDx.js → main-x9ygUnoL.js} +1030 -988
  17. package/dist/chunks/{pair-cli-BPyh48--.js → pair-cli-Cph4TZ2R.js} +2 -2
  18. package/dist/chunks/{remote-config-B0zBDBak.js → remote-config-CmP36r_s.js} +2 -2
  19. package/dist/chunks/{rtk-resolver-BDHi6RMv.js → rtk-resolver-C_IReILP.js} +1 -1
  20. package/dist/chunks/rtk-resolver-DgnNb1or.js +1 -0
  21. package/dist/chunks/{session-CUc6d7aS.js → session-BwlLY_mv.js} +36 -14
  22. package/dist/chunks/{session-routes--hrsvv7a.js → session-routes-CviNvxcz.js} +9 -1
  23. package/dist/chunks/{settings-cli-DzIasX94.js → settings-cli-Bete5oVk.js} +11 -10
  24. package/dist/chunks/{settings-readout-core-BOv6tqdK.js → settings-readout-core-CS8MPaIE.js} +14 -8
  25. package/dist/chunks/shown-files-core-soMzCQ1D.js +145 -0
  26. package/dist/chunks/{ssh-sign-cli-C_QYhDvI.js → ssh-sign-cli-DXhuqzuy.js} +2 -2
  27. package/dist/client/assets/action-status-BwqYb9eF.js +1 -0
  28. package/dist/client/assets/action-status-BwqYb9eF.js.br +0 -0
  29. package/dist/client/assets/benchmark-panel-BulIdLtq.js +1 -0
  30. package/dist/client/assets/benchmark-panel-BulIdLtq.js.br +0 -0
  31. package/dist/client/assets/card-dom-DkZgkeG9.js +1 -0
  32. package/dist/client/assets/card-dom-DkZgkeG9.js.br +0 -0
  33. package/dist/client/assets/control-ws-CAcwW-r9.js +4 -0
  34. package/dist/client/assets/control-ws-CAcwW-r9.js.br +0 -0
  35. package/dist/client/assets/dialogs-CCP1ipXD.js +79 -0
  36. package/dist/client/assets/dialogs-CCP1ipXD.js.br +0 -0
  37. package/dist/client/assets/dom-helpers-xJduxDcc.js +1 -0
  38. package/dist/client/assets/dom-helpers-xJduxDcc.js.br +0 -0
  39. package/dist/client/assets/hooks-panel-BWDeSHtM.js +1 -0
  40. package/dist/client/assets/hooks-panel-BWDeSHtM.js.br +0 -0
  41. package/dist/client/assets/index-D6m--U7B.js +84 -0
  42. package/dist/client/assets/index-D6m--U7B.js.br +0 -0
  43. package/dist/client/assets/index-DF3BLGk9.css +2 -0
  44. package/dist/client/assets/index-DF3BLGk9.css.br +0 -0
  45. package/dist/client/assets/issues-panel-B7Y1Lpyx.js +1 -0
  46. package/dist/client/assets/issues-panel-B7Y1Lpyx.js.br +0 -0
  47. package/dist/client/assets/modal-mWl2H7A_.js +1 -0
  48. package/dist/client/assets/modal-mWl2H7A_.js.br +0 -0
  49. package/dist/client/assets/plan-face-DpzZfVeG.js +3 -0
  50. package/dist/client/assets/plan-face-DpzZfVeG.js.br +0 -0
  51. package/dist/client/assets/{poll-ago-ItO-gOWA.js → poll-ago-Bc-8mMFj.js} +1 -1
  52. package/dist/client/assets/poll-ago-Bc-8mMFj.js.br +0 -0
  53. package/dist/client/assets/pr-scope-tabs-DftvVYU8.js +1 -0
  54. package/dist/client/assets/pr-scope-tabs-DftvVYU8.js.br +0 -0
  55. package/dist/client/assets/radar-panel-hxjF7m9Z.js +1 -0
  56. package/dist/client/assets/radar-panel-hxjF7m9Z.js.br +0 -0
  57. package/dist/client/assets/review-queue-panel-8bP8Q7RR.js +10 -0
  58. package/dist/client/assets/review-queue-panel-8bP8Q7RR.js.br +0 -0
  59. package/dist/client/assets/roving-keys-core-BDobx2It.js +1 -0
  60. package/dist/client/assets/settings-panel-B50lNcrt.js +4 -0
  61. package/dist/client/assets/settings-panel-B50lNcrt.js.br +0 -0
  62. package/dist/client/assets/trace-panel-Dy-fgi9c.js +2 -0
  63. package/dist/client/assets/trace-panel-Dy-fgi9c.js.br +0 -0
  64. package/dist/client/assets/ui-prefs-CNf6fId2.js +1 -0
  65. package/dist/client/assets/ui-prefs-CNf6fId2.js.br +0 -0
  66. package/dist/client/assets/usage-panel-D2JuiQ4G.js +1 -0
  67. package/dist/client/assets/usage-panel-D2JuiQ4G.js.br +0 -0
  68. package/dist/client/assets/visions-panel-CI6CRn42.js +1 -0
  69. package/dist/client/assets/visions-panel-CI6CRn42.js.br +0 -0
  70. package/dist/client/index.html +14 -8
  71. package/dist/client/index.html.br +0 -0
  72. package/dist/server/index.js +99 -1
  73. package/dist/session/guardrails-open-launcher.js +28 -16
  74. package/dist/session/visions-relay.js +1 -1
  75. package/package.json +1 -1
  76. package/dist/chunks/config-store-DlaaBY9p.js +0 -1
  77. package/dist/chunks/rtk-resolver-Dr4iJsiS.js +0 -1
  78. package/dist/client/assets/action-status-DrMQzohk.js +0 -1
  79. package/dist/client/assets/action-status-DrMQzohk.js.br +0 -0
  80. package/dist/client/assets/benchmark-panel-D09qvrAY.js +0 -1
  81. package/dist/client/assets/benchmark-panel-D09qvrAY.js.br +0 -0
  82. package/dist/client/assets/dom-helpers-CZ8NZKxw.js +0 -4
  83. package/dist/client/assets/dom-helpers-CZ8NZKxw.js.br +0 -0
  84. package/dist/client/assets/hooks-panel-R-L7DuIz.js +0 -1
  85. package/dist/client/assets/hooks-panel-R-L7DuIz.js.br +0 -0
  86. package/dist/client/assets/index-B7TvZo7W.js +0 -173
  87. package/dist/client/assets/index-B7TvZo7W.js.br +0 -0
  88. package/dist/client/assets/index-C3nOrTwM.css +0 -2
  89. package/dist/client/assets/index-C3nOrTwM.css.br +0 -0
  90. package/dist/client/assets/issues-panel-CyB4oq9Z.js +0 -1
  91. package/dist/client/assets/issues-panel-CyB4oq9Z.js.br +0 -0
  92. package/dist/client/assets/modal-M_mJ8--V.js +0 -1
  93. package/dist/client/assets/modal-M_mJ8--V.js.br +0 -0
  94. package/dist/client/assets/poll-ago-ItO-gOWA.js.br +0 -0
  95. package/dist/client/assets/pr-queue-columns-Cu3-PADL.js +0 -1
  96. package/dist/client/assets/pr-queue-columns-Cu3-PADL.js.br +0 -0
  97. package/dist/client/assets/radar-panel-Cl3yPWed.js +0 -1
  98. package/dist/client/assets/radar-panel-Cl3yPWed.js.br +0 -0
  99. package/dist/client/assets/review-queue-panel-CVujzadC.js +0 -2
  100. package/dist/client/assets/review-queue-panel-CVujzadC.js.br +0 -0
  101. package/dist/client/assets/settings-panel-DW5An8lQ.js +0 -3
  102. package/dist/client/assets/settings-panel-DW5An8lQ.js.br +0 -0
  103. package/dist/client/assets/trace-panel-B6TiM5pb.js +0 -1
  104. package/dist/client/assets/trace-panel-B6TiM5pb.js.br +0 -0
  105. package/dist/client/assets/ui-prefs-CQHZFVx6.js +0 -1
  106. package/dist/client/assets/ui-prefs-CQHZFVx6.js.br +0 -0
  107. package/dist/client/assets/usage-panel-D2RX3LtG.js +0 -1
  108. package/dist/client/assets/usage-panel-D2RX3LtG.js.br +0 -0
  109. package/dist/client/assets/visions-panel-BV9EKCBw.js +0 -1
  110. package/dist/client/assets/visions-panel-BV9EKCBw.js.br +0 -0
@@ -1,6 +1,6 @@
1
1
  import { r as errorMessage } from "./text-DoirglWV.js";
2
- import { c as resolveConfigPath } from "./config-store-CXLnauAa.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-B0zBDBak.js";
2
+ import { l as resolveConfigPath } from "./config-store-BGTg8oKO.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-CmP36r_s.js";
4
4
  import fs from "node:fs";
5
5
  //#region server/text-format.ts
6
6
  function trimIso(iso) {
@@ -2,8 +2,8 @@ import { n as errorLabel, r as errorMessage } from "./text-DoirglWV.js";
2
2
  import { n as equalsIgnoringCaseOnWindows } from "./paths-Bu4eH1Yd.js";
3
3
  import { n as isRecord } from "./coerce-NSst8oRP.js";
4
4
  import { n as unrefTimer, t as DEFAULT_TIMER_FNS } from "./timer-deps-u2DAQLok.js";
5
- import { a as jsonStateLoadError, d as writeJsonAtomicSync, l as sleepSync, s as loadJsonStateFileSync, u as writeJsonAtomic } from "./json-file-DFCTvPjj.js";
6
- import { lt as canonicalizePath, o as glimmervoidHomeDir } from "./config-store-CXLnauAa.js";
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-BGTg8oKO.js";
7
7
  import fs from "node:fs";
8
8
  import path from "node:path";
9
9
  import crypto from "node:crypto";
@@ -1,5 +1,5 @@
1
+ import { n as glimmervoidHomeDir } from "./config-path-core-DUWk0Lui.js";
1
2
  import { i as execSync } from "./child-process-safe-D4hyVIXj.js";
2
- import { n as glimmervoidHomeDir } from "./config-path-core-DFt-TemS.js";
3
3
  import { r as resolveRtkPath } from "./hook-tools-Dl7-r2Eb.js";
4
4
  import fs from "node:fs";
5
5
  import os from "node:os";
@@ -0,0 +1 @@
1
+ export { t as getRtkPath } from "./rtk-resolver-C_IReILP.js";
@@ -143,7 +143,19 @@ var FindingSeverity = z.enum([
143
143
  "MEDIUM",
144
144
  "LOW"
145
145
  ]);
146
- var DraftComment = ReviewComment.extend({ severity: FindingSeverity.optional() });
146
+ var DiffExcerptLine = z.object({
147
+ line: z.number().int().positive().nullable(),
148
+ kind: z.enum([
149
+ "add",
150
+ "del",
151
+ "context"
152
+ ]),
153
+ text: z.string()
154
+ });
155
+ var DraftComment = ReviewComment.extend({
156
+ severity: FindingSeverity.optional(),
157
+ excerpt: z.array(DiffExcerptLine).max(9).optional()
158
+ });
147
159
  var ReviewFinding = z.object({
148
160
  path: z.string().min(1),
149
161
  line: z.number().int().positive().nullable(),
@@ -186,7 +198,11 @@ var PostingPlan = z.object({
186
198
  body: z.string().min(1)
187
199
  }))
188
200
  });
189
- var PostedReviewEvent = z.enum(["APPROVE", "COMMENT"]);
201
+ var PostedReviewEvent = z.enum([
202
+ "APPROVE",
203
+ "COMMENT",
204
+ "REQUEST_CHANGES"
205
+ ]);
190
206
  var GithubReviewState = z.enum([
191
207
  "APPROVED",
192
208
  "CHANGES_REQUESTED",
@@ -373,6 +389,7 @@ var TeamReviewAction = z.enum([
373
389
  "approve",
374
390
  "approve-only",
375
391
  "comment",
392
+ "request-changes",
376
393
  "discard",
377
394
  "requeue",
378
395
  "resolve-thread"
@@ -424,8 +441,6 @@ var TeamReviewStateEntry = z.object({
424
441
  draft: ReviewDraft.nullable(),
425
442
  reviewedHead: CommitSha.nullable(),
426
443
  inFlight: z.boolean(),
427
- skipReason: z.string().nullable(),
428
- handReview: QueuedReview.optional(),
429
444
  reviewAttempts: z.number().int().nonnegative().default(0),
430
445
  resumable: ResumableReview.nullable().optional(),
431
446
  reviewedAt: z.number().optional(),
@@ -481,7 +496,6 @@ var TeamReviewStatus = z.object({
481
496
  drafts: z.array(ReviewDraft),
482
497
  inFlight: z.array(InFlightReview),
483
498
  queued: z.array(QueuedReview).default([]),
484
- handReview: z.array(QueuedReview).default([]),
485
499
  team: z.object({
486
500
  org: z.string(),
487
501
  slug: z.string(),
@@ -880,11 +894,6 @@ var RefinedTaskTitle = z.object({
880
894
  }).strict();
881
895
  var SessionState = z.enum(STATES);
882
896
  var UnseenOutcome = z.enum(["finished", "failed"]);
883
- var PendingWakeup = z.object({
884
- at: z.number().finite().nullable(),
885
- kind: z.string(),
886
- reason: z.string().nullable()
887
- }).passthrough();
888
897
  var ASK_USER_QUESTION_TOOL_NAME = "AskUserQuestion";
889
898
  var CONVERSATION_APPROVAL_SUMMARY_MAX_CHARS = 4e3;
890
899
  var CONVERSATION_PERMISSION_HOOK_EVENT = "permissionrequest-conversation";
@@ -953,9 +962,6 @@ var SessionSnapshot = z.object({
953
962
  resumeSessionId: z.string().nullable(),
954
963
  activeAgents: z.number().int().nonnegative(),
955
964
  awaitingBackgroundTasks: z.boolean(),
956
- isCompacting: z.boolean().default(false),
957
- isWaitingForMemory: z.boolean().default(false),
958
- pendingWakeup: PendingWakeup.nullable(),
959
965
  pendingPromptKind: z.string().nullable(),
960
966
  conversationApproval: ConversationApproval.nullable().default(null),
961
967
  hasConversationBridge: z.boolean().default(false),
@@ -995,6 +1001,7 @@ var SESSION_COMMANDS = [
995
1001
  "attention",
996
1002
  "board",
997
1003
  "edit",
1004
+ "show",
998
1005
  "review",
999
1006
  "reviews",
1000
1007
  "prs",
@@ -1116,6 +1123,21 @@ z.object({
1116
1123
  var SESSION_DOC_BODY_CAP_BYTES = 262144;
1117
1124
  var SESSION_DOC_PATH_MAX_CHARS = 4096;
1118
1125
  var AgentEditRequest = z.object({ path: z.string({ error: "path must be a string" }).min(1, { error: "path must not be empty" }).max(SESSION_DOC_PATH_MAX_CHARS, { error: `path must be at most ${SESSION_DOC_PATH_MAX_CHARS} characters` }) }).strict();
1126
+ var SHOWN_FILE_CAP_BYTES = 209715200;
1127
+ var ShownFile = z.object({
1128
+ id: z.string(),
1129
+ name: z.string(),
1130
+ caption: z.string().max(500).nullable(),
1131
+ kind: z.enum([
1132
+ "image",
1133
+ "video",
1134
+ "page"
1135
+ ]),
1136
+ mime: z.string(),
1137
+ sizeBytes: z.number().int().nonnegative(),
1138
+ pageTitle: z.string().nullable(),
1139
+ shownAt: z.number().finite()
1140
+ }).strict();
1119
1141
  var SessionDoc = z.object({
1120
1142
  path: z.string(),
1121
1143
  name: z.string(),
@@ -1144,4 +1166,4 @@ var AgentLimitsReply = z.object({
1144
1166
  }).strict())
1145
1167
  }).strict().extend({ ok: z.literal(true) }).strict();
1146
1168
  //#endregion
1147
- export { MyPrMergeWhenReadyRequest as $, RESTARTABLE_STATES as $t, SESSION_NAME_RULE_TEXT as A, TeamReviewStateEntry as At, UnseenOutcome as B, HEX_SHA_RE as Bt, ConversationQuestion as C, ReviewResult as Ct, SESSION_DOC_BODY_CAP_BYTES as D, TeamReviewActionResult as Dt, SESSION_COMMANDS as E, TeamReviewActionRequest as Et, SessionState as F, canApproveAfterComment as Ft, MyPrCheckContextsResponse as G, repoParts as Gt, MyPr as H, GH_SEGMENT as Ht, SshSignReply as I, decisionAsIfApprovalRequired as It, MyPrLaneEntry as J, GithubPrsFreshness as Jt, MyPrKeepMergeableRequest as K, GithubPollingRefreshRequest as Kt, SshSignRequest as L, hasRequiredActionHead as Lt, SSH_SIGN_BODY_CAP_BYTES as M, TeamReviewThreadCommentsResponse as Mt, SessionDoc as N, TeamReviewThreadResult as Nt, SESSION_DOC_PATH_MAX_CHARS as O, TeamReviewCompareFiles as Ot, SessionSnapshot as P, TeamReviewThreadsRepository as Pt, MyPrMergeStateResponse as Q, MERGEABLE_LIVE_STATES as Qt, TASK_TITLE_CONTROL_CHARACTERS as R, hasStandingViewerApproval as Rt, ConversationApprovalDecision as S, ReviewFinding as St, RefinedTaskTitle as T, ReviewVerdict as Tt, MyPrAutoRebase as U, NODE_ID_RE as Ut, LinkedPr as V, shortSha as Vt, MyPrCheckContext as W, REPO_SLUG_RE as Wt, MyPrMergeRequest as X, BADGE_LABELS as Xt, MyPrMergeMethod as Y, githubPollingShape as Yt, MyPrMergeResult as Z, KILLABLE_STATES as Zt, CONVERSATION_PERMISSION_HOOK_EVENT as _, PrDetail as _t, AgentAttentionRequest as a, MyPrsState as at, ConversationAnswers as b, ReviewComment as bt, AgentLimitsReply as c, pullRequestKeyFormat as ct, AgentSendRequest as d, DECIDING_REVIEW_STATES as dt, STATES as en, MyPrMergeWhenReadyResult as et, AgentSettingsReply as f, EarlierReview as ft, CONVERSATION_APPROVAL_SUMMARY_MAX_CHARS as g, PostingPlan as gt, COHERENCE_HOOKS_INACTIVE as h, GithubReviewState as ht, AgentAnswerRequest as i, MyPrsSnapshot as it, SIGN_URL_ENV as j, TeamReviewStatus as jt, SESSION_NAME_PATTERN as k, TeamReviewResolveResponse as kt, AgentPullRequestRequest as l, repositoryName as lt, AgentSpawnRequest as m, GithubReviewDecision as mt, AGENT_URL_ENV as n, MyPrThreadNode as nt, AgentCloseRequest as o, MyPrsStatus as ot, AgentSettingsRequest as p, FindingSeverity as pt, MyPrKeepMergeableResult as q, GithubPollingRefreshResult as qt, ASK_USER_QUESTION_TOOL_NAME as r, MyPrThreadsResponse as rt, AgentEditRequest as s, SessionPrLinks as st, AGENT_API_VERBS as t, MyPrSearchNode as tt, AgentReadRequest as u, CommitSha as ut, CONVERSATION_TOOL_RESULT_HOOK_EVENT as v, QueuedReview as vt, PendingWakeup as w, ReviewThreadId as wt, ConversationApproval as x, ReviewDraft as xt, CoherenceHooksState as y, ReviewChecksState as yt, TaskTitle as z, FULL_SHA_RE as zt };
1169
+ 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 };
@@ -1,4 +1,4 @@
1
- import { E as SESSION_COMMANDS } from "./session-CUc6d7aS.js";
1
+ import { T as SESSION_COMMANDS } from "./session-BwlLY_mv.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.";
@@ -73,6 +73,13 @@ function editRoute(caller) {
73
73
  reason: "a lane session cannot surface a file, because it has no card for the operator to open the file from"
74
74
  };
75
75
  }
76
+ function showRoute(caller) {
77
+ if (hasOperatorCard(caller)) return ANSWERS;
78
+ return {
79
+ answers: false,
80
+ reason: "a lane session cannot show a file, because it has no card for the operator to see it on"
81
+ };
82
+ }
76
83
  function operatorStateRoute(caller) {
77
84
  if (hasOperatorCard(caller)) return ANSWERS;
78
85
  return {
@@ -115,6 +122,7 @@ var COMMAND_ROUTES = Object.freeze({
115
122
  attention: attentionRoute,
116
123
  board: () => ANSWERS,
117
124
  edit: editRoute,
125
+ show: showRoute,
118
126
  review: operatorStateRoute,
119
127
  reviews: operatorStateRoute,
120
128
  prs: operatorStateRoute,
@@ -1,11 +1,11 @@
1
1
  import { r as errorMessage, t as errorCode } from "./text-DoirglWV.js";
2
- import { f as AgentSettingsReply } from "./session-CUc6d7aS.js";
3
- import { r as BrowserConfig } from "./config-BLeRKmn9.js";
2
+ import { n as glimmervoidHomeDir, t as decideConfigPath } from "./config-path-core-DUWk0Lui.js";
3
+ import { f as AgentSettingsReply } from "./session-BwlLY_mv.js";
4
+ import { r as BrowserConfig } from "./config-BqJTnPae.js";
4
5
  import { n as isRecord } from "./coerce-NSst8oRP.js";
5
6
  import { t as renderTable } from "./ascii-figure-core-pDAwtlKO.js";
6
- import { n as glimmervoidHomeDir, t as decideConfigPath } from "./config-path-core-DFt-TemS.js";
7
- import { $ as readEnvSecrets, C as deleteValueAtPath, D as scoreSettingsSearch, E as parsePosthogProjectSelection, N as SETTINGS_REGISTRY, O as setValueAtPath, Q as ENV_SECRET_BINDINGS, S as cloneValue, j as valueAtPath, l as saveConfigFileOnce, s as loadConfigFile, tt as withEnvSecrets, u as validateConfig } from "./config-store-CXLnauAa.js";
8
- import { a as fail, c as listSettings, d as renderSectionTables, f as requireConfigFileSetting, g as valueText, h as succeed, i as describeSetting, l as readSetting, m as settingsRequestForServer, n as configFileViewOf, o as fitColumn, p as sectionOf, r as defaultText, s as getSetting, t as ALL_SETTINGS } from "./settings-readout-core-BOv6tqdK.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-BGTg8oKO.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-CS8MPaIE.js";
9
9
  import fs from "node:fs";
10
10
  import os from "node:os";
11
11
  import { parseArgs } from "node:util";
@@ -165,7 +165,7 @@ function openConfigFile() {
165
165
  if (!decided.path) return fail(`no config.json at ${decided.homePath}. Start Glimmervoid once to create it; glimmervoid settings schema needs no config file`);
166
166
  const loaded = readConfigFile(decided.path, homeDir);
167
167
  if (!loaded.ok) return fail(loaded.message);
168
- return succeed(configFileViewOf(decided.path, loaded.value, env));
168
+ return succeed(configFileViewOf(decided.path, loaded.value, env, IS_EXPERIMENTAL_BUILD));
169
169
  }
170
170
  function print(context, jsonValue, text) {
171
171
  context.writeOutput(`${context.isJson ? JSON.stringify(jsonValue, null, 2) : text}\n`);
@@ -177,7 +177,7 @@ function requireView() {
177
177
  return opened.value;
178
178
  }
179
179
  function requireSetting(context, view) {
180
- const resolved = requireConfigFileSetting(requirePositional(context.positionals, 1, "path"), view.configPath);
180
+ const resolved = requireConfigFileSetting(requirePositional(context.positionals, 1, "path"), view);
181
181
  if (!resolved.ok) throw new Error(resolved.message);
182
182
  return resolved.value;
183
183
  }
@@ -246,7 +246,7 @@ var commands = {
246
246
  search: (context) => {
247
247
  const query = context.positionals.slice(1).join(" ");
248
248
  if (query.trim() === "") throw new Error(`missing <text>\n\n${usage}`);
249
- const results = scoreSettingsSearch(SETTINGS_REGISTRY.sections, query, SETTINGS_REGISTRY.fileOnly);
249
+ const results = scoreSettingsSearch(SETTINGS_REGISTRY.sections, query, SETTINGS_REGISTRY.fileOnly).filter((result) => isSettingAvailable(result.setting, IS_EXPERIMENTAL_BUILD));
250
250
  const rows = results.map((result) => [
251
251
  result.setting.scope === "browser" ? `${result.setting.id} (browser preference)` : result.setting.path,
252
252
  result.setting.title,
@@ -281,7 +281,8 @@ var commands = {
281
281
  setting.unit?.label ?? "",
282
282
  setting.takesEffect
283
283
  ];
284
- return print(context, ALL_SETTINGS.map(describeSetting), renderSectionTables(ALL_SETTINGS, [
284
+ const settings = availableSettings(IS_EXPERIMENTAL_BUILD);
285
+ return print(context, settings.map(describeSetting), renderSectionTables(settings, [
285
286
  "Id",
286
287
  "Path",
287
288
  "Type",
@@ -329,7 +330,7 @@ function processIo() {
329
330
  async function runSettingsCli(commandArguments, io = processIo()) {
330
331
  const serverRequest = settingsRequestForServer(commandArguments, process.env);
331
332
  if (!serverRequest) return runSettingsCommand(commandArguments, io);
332
- const { askAgentApi } = await import("./agent-api-cli-DdrR2vnB.js");
333
+ const { askAgentApi } = await import("./agent-api-cli-B0l8uLos.js");
333
334
  const reply = AgentSettingsReply.safeParse(await askAgentApi("settings", serverRequest).catch((error) => ({
334
335
  ok: false,
335
336
  error: errorMessage(error)
@@ -1,6 +1,6 @@
1
- import { p as AgentSettingsRequest } from "./session-CUc6d7aS.js";
1
+ import { p as AgentSettingsRequest } from "./session-BwlLY_mv.js";
2
2
  import { t as renderTable } from "./ascii-figure-core-pDAwtlKO.js";
3
- import { $ as readEnvSecrets, A as settingsOf, M as FILE_ONLY_GROUPS, N as SETTINGS_REGISTRY, S as cloneValue, T as hasScaledUnit, j as valueAtPath, k as settingsGroupOf, w as displayText, x as SETTINGS_INDEX } from "./config-store-CXLnauAa.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-BGTg8oKO.js";
4
4
  import { parseArgs } from "node:util";
5
5
  //#region server/core/settings-readout-core.ts
6
6
  var VALUE_COLUMN_WIDTH = 40;
@@ -116,22 +116,28 @@ function renderSectionTables(settings, headers, rowOf) {
116
116
  function resolveSetting(argument) {
117
117
  return SETTINGS_INDEX.byPath.get(argument) ?? SETTINGS_INDEX.byId.get(argument) ?? null;
118
118
  }
119
- function requireConfigFileSetting(argument, configPath) {
119
+ function availableSettings(isExperimentalBuild) {
120
+ return ALL_SETTINGS.filter((setting) => isSettingAvailable(setting, isExperimentalBuild));
121
+ }
122
+ function requireConfigFileSetting(argument, view) {
123
+ const { configPath } = view;
120
124
  const setting = resolveSetting(argument);
121
125
  if (!setting) return fail(`${argument} is not a setting in the registry, so this command cannot read or change it; edit config.json at ${configPath} by hand`);
126
+ if (!isSettingAvailable(setting, view.isExperimentalBuild)) return fail(`${setting.path} is an experimental setting, so it exists only on an experimental build; switch Settings > Updates > Channel to Experimental and update to use it`);
122
127
  if (setting.scope === "browser") return fail(`${setting.id} is a browser preference saved in each browser, not in config.json; change it in the dashboard under Settings > ${sectionOf(setting).title}`);
123
128
  if (setting.control === "readonly") return fail(`${setting.id} is a read-only status row under Settings > ${sectionOf(setting).title}; it has no config.json key`);
124
129
  return succeed(setting);
125
130
  }
126
- function configFileViewOf(configPath, config, env) {
131
+ function configFileViewOf(configPath, config, env, isExperimentalBuild) {
127
132
  return {
128
133
  configPath,
129
134
  config,
130
- secretSources: Object.fromEntries(readEnvSecrets(env).map((secret) => [`${secret.blockName}.${secret.secretKey}`, secret.environmentVariable]))
135
+ secretSources: Object.fromEntries(readEnvSecrets(env).map((secret) => [`${secret.blockName}.${secret.secretKey}`, secret.environmentVariable])),
136
+ isExperimentalBuild
131
137
  };
132
138
  }
133
139
  function listSettings(view) {
134
- const settings = ALL_SETTINGS.filter(isConfigFileSetting);
140
+ const settings = availableSettings(view.isExperimentalBuild).filter(isConfigFileSetting);
135
141
  const readouts = settings.map((setting) => readSetting(setting, view));
136
142
  const readoutById = new Map(readouts.map((readout) => [readout.id, readout]));
137
143
  const rowOf = (setting) => {
@@ -173,7 +179,7 @@ function readSettingsForAgent({ command, path }, view) {
173
179
  ok: false,
174
180
  error: "get needs a setting path or id, such as posthog.trafficSpikeEnabled"
175
181
  };
176
- const resolved = requireConfigFileSetting(path, view.configPath);
182
+ const resolved = requireConfigFileSetting(path, view);
177
183
  if (!resolved.ok) return {
178
184
  ok: false,
179
185
  error: resolved.message
@@ -198,4 +204,4 @@ function settingsRequestForServer(commandArguments, env) {
198
204
  return parsed.success ? parsed.data : null;
199
205
  }
200
206
  //#endregion
201
- export { fail as a, listSettings as c, renderSectionTables as d, requireConfigFileSetting as f, valueText as g, succeed as h, describeSetting as i, readSetting as l, settingsRequestForServer as m, configFileViewOf as n, fitColumn as o, sectionOf as p, defaultText as r, getSetting as s, ALL_SETTINGS as t, readSettingsForAgent as u };
207
+ export { fail as a, listSettings as c, renderSectionTables as d, requireConfigFileSetting as f, valueText as g, succeed as h, describeSetting as i, readSetting as l, settingsRequestForServer as m, configFileViewOf as n, fitColumn as o, sectionOf as p, defaultText as r, getSetting as s, availableSettings as t, readSettingsForAgent as u };
@@ -0,0 +1,145 @@
1
+ import { A as SHOWN_FILE_CAP_BYTES } from "./session-BwlLY_mv.js";
2
+ import path from "node:path";
3
+ //#region server/core/shown-files-core.ts
4
+ var SHOWN_SNIFF_BYTES = 65536;
5
+ var PAGE_TITLE_MAX_CHARS = 200;
6
+ var BYTES_PER_MEGABYTE = 1048576;
7
+ var ACCEPTED_KINDS_TEXT = "PNG, JPEG, WebP, GIF, SVG, MP4, WebM or HTML";
8
+ var PNG = {
9
+ kind: "image",
10
+ mime: "image/png",
11
+ extension: ".png"
12
+ };
13
+ var JPEG = {
14
+ kind: "image",
15
+ mime: "image/jpeg",
16
+ extension: ".jpg"
17
+ };
18
+ var GIF = {
19
+ kind: "image",
20
+ mime: "image/gif",
21
+ extension: ".gif"
22
+ };
23
+ var WEBP = {
24
+ kind: "image",
25
+ mime: "image/webp",
26
+ extension: ".webp"
27
+ };
28
+ var SVG = {
29
+ kind: "image",
30
+ mime: "image/svg+xml",
31
+ extension: ".svg"
32
+ };
33
+ var MP4 = {
34
+ kind: "video",
35
+ mime: "video/mp4",
36
+ extension: ".mp4"
37
+ };
38
+ var WEBM = {
39
+ kind: "video",
40
+ mime: "video/webm",
41
+ extension: ".webm"
42
+ };
43
+ var PAGE = {
44
+ kind: "page",
45
+ mime: "text/html; charset=utf-8",
46
+ extension: ".html"
47
+ };
48
+ var SHOWN_FORMATS = [
49
+ PNG,
50
+ JPEG,
51
+ GIF,
52
+ WEBP,
53
+ SVG,
54
+ MP4,
55
+ WEBM,
56
+ PAGE
57
+ ];
58
+ var PNG_SIGNATURE = Buffer.from([
59
+ 137,
60
+ 80,
61
+ 78,
62
+ 71,
63
+ 13,
64
+ 10,
65
+ 26,
66
+ 10
67
+ ]);
68
+ var JPEG_SIGNATURE = Buffer.from([
69
+ 255,
70
+ 216,
71
+ 255
72
+ ]);
73
+ var WEBM_SIGNATURE = Buffer.from([
74
+ 26,
75
+ 69,
76
+ 223,
77
+ 163
78
+ ]);
79
+ var UTF8_BYTE_ORDER_MARK = "";
80
+ var PAGE_TITLE_RE = /<title[^>]*>([\s\S]*?)<\/title>/i;
81
+ function startsWithBytes(chunk, signature, offset = 0) {
82
+ return chunk.length >= offset + signature.length && chunk.subarray(offset, offset + signature.length).equals(signature);
83
+ }
84
+ function asciiAt(chunk, offset, length) {
85
+ return chunk.subarray(offset, offset + length).toString("latin1");
86
+ }
87
+ function sniffBinaryFormat(chunk) {
88
+ if (startsWithBytes(chunk, PNG_SIGNATURE)) return PNG;
89
+ if (startsWithBytes(chunk, JPEG_SIGNATURE)) return JPEG;
90
+ if (asciiAt(chunk, 0, 6) === "GIF87a" || asciiAt(chunk, 0, 6) === "GIF89a") return GIF;
91
+ if (asciiAt(chunk, 0, 4) === "RIFF" && asciiAt(chunk, 8, 4) === "WEBP") return WEBP;
92
+ if (asciiAt(chunk, 4, 4) === "ftyp") return MP4;
93
+ if (startsWithBytes(chunk, WEBM_SIGNATURE)) return WEBM;
94
+ return null;
95
+ }
96
+ function leadingMarkup(chunk) {
97
+ const text = chunk.toString("utf8");
98
+ return (text.startsWith(UTF8_BYTE_ORDER_MARK) ? text.slice(1) : text).trimStart().toLowerCase();
99
+ }
100
+ function sniffMarkupFormat(chunk, declaredName) {
101
+ const markup = leadingMarkup(chunk);
102
+ if (!markup.startsWith("<")) return null;
103
+ if (markup.startsWith("<svg")) return SVG;
104
+ if (markup.startsWith("<!doctype html") || markup.startsWith("<html")) return PAGE;
105
+ const declaredExtension = path.extname(declaredName).toLowerCase();
106
+ if (declaredExtension === ".svg" && markup.includes("<svg")) return SVG;
107
+ if (declaredExtension === ".html" || declaredExtension === ".htm") return PAGE;
108
+ if (markup.startsWith("<?xml") && markup.includes("<svg")) return SVG;
109
+ return null;
110
+ }
111
+ function decideShownKind(firstChunk, declaredName) {
112
+ const format = sniffBinaryFormat(firstChunk) ?? sniffMarkupFormat(firstChunk, declaredName);
113
+ if (!format) return {
114
+ ok: false,
115
+ error: `${declaredName} is not a file show takes; show takes ${ACCEPTED_KINDS_TEXT} files`
116
+ };
117
+ return {
118
+ ok: true,
119
+ kind: format.kind,
120
+ mime: format.mime,
121
+ extension: format.extension
122
+ };
123
+ }
124
+ function shownMimeForFilename(filename) {
125
+ const extension = path.extname(filename).toLowerCase();
126
+ return SHOWN_FORMATS.find((format) => format.extension === extension)?.mime ?? null;
127
+ }
128
+ function megabytesOf(sizeBytes) {
129
+ return Math.ceil(sizeBytes / BYTES_PER_MEGABYTE);
130
+ }
131
+ function describeOverCap(name, sizeBytes) {
132
+ const limit = `show takes files up to ${megabytesOf(SHOWN_FILE_CAP_BYTES)} MB`;
133
+ if (sizeBytes === null) return `${name} is too large; ${limit}`;
134
+ return `${name} is ${megabytesOf(sizeBytes)} MB; ${limit}`;
135
+ }
136
+ function readPageTitle(firstChunk) {
137
+ const title = PAGE_TITLE_RE.exec(firstChunk.subarray(0, 65536).toString("utf8"))?.[1]?.replace(/\s+/g, " ").trim() ?? "";
138
+ return title ? title.slice(0, PAGE_TITLE_MAX_CHARS) : null;
139
+ }
140
+ function filesAfterRetention(files, droppedIds) {
141
+ const dropped = new Set(droppedIds);
142
+ return files.filter((file) => !dropped.has(file.id));
143
+ }
144
+ //#endregion
145
+ export { readPageTitle as a, filesAfterRetention as i, decideShownKind as n, shownMimeForFilename as o, describeOverCap as r, SHOWN_SNIFF_BYTES as t };
@@ -1,8 +1,8 @@
1
1
  import { r as errorMessage } from "./text-DoirglWV.js";
2
- import { I as SshSignReply, j as SIGN_URL_ENV } from "./session-CUc6d7aS.js";
2
+ import { L as SshSignReply, j as SIGN_URL_ENV } from "./session-BwlLY_mv.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-DIGH1v3_.js";
5
+ import { n as postToAgentIngress } from "./agent-api-cli-Bq9J0_D5.js";
6
6
  import { l as parseSshPublicKey } from "./ssh-signing-core-CRhVVWNW.js";
7
7
  import path from "node:path";
8
8
  import fs from "node:fs/promises";
@@ -0,0 +1 @@
1
+ import{C as e,gt as t,o as n,x as r,yt as i}from"./dom-helpers-xJduxDcc.js";import{l as a,u as o}from"./control-ws-CAcwW-r9.js";var s=`http://www.w3.org/2000/svg`;function c(e,t){let n=document.createElementNS(s,e);for(let[e,r]of Object.entries(t))n.setAttribute(e,r);return n}function l(e,t){let n=document.createElementNS(s,`svg`);return n.setAttribute(`width`,String(e)),n.setAttribute(`height`,String(t)),n.setAttribute(`viewBox`,`0 0 ${e} ${t}`),n.setAttribute(`aria-hidden`,`true`),n}var u=`M4 4L12 12M12 4L4 12`,d=`M12 8a4 4 0 1 1-8 0a4 4 0 1 1 8 0M8 1.5v2.5M8 12v2.5M1.5 8h2.5M12 8h2.5M3.4 3.4l1.77 1.77M10.83 10.83l1.77 1.77M3.4 12.6l1.77-1.77M10.83 5.17l1.77-1.77`,f=`M3 4h10M3 8h10M3 12h10`,p=`M3 8h0.01M8 8h0.01M13 8h0.01`,m=`M8 2.5v6M5 5.5h6M5 12.5h6`,h=`M4.5 12.5h7a3 3 0 0 0 0.4-5.97a4 4 0 0 0-7.7 0.57a2.7 2.7 0 0 0 0.3 5.4z`,g=`M8 1.8l5.2 2v4c0 3.2-2.2 5.4-5.2 6.4c-3-1-5.2-3.2-5.2-6.4v-4z`,_=`${g}M2 2l12 12`,v=`M9.2 1.5L3.5 9h4.3l-1 5.5L12.5 7H8.2z`,y=`M8.7 4.2L5.6 8.6h2.5l-.6 3.2l3.1-4.4H8.1z`,b=`M3 13V9M8 13V3M13 13V6.5`;function x(e,t=`2`){let n=l(16,16);return n.classList.add(`line-icon`),n.append(c(`path`,{d:e,fill:`none`,stroke:`currentColor`,"stroke-width":t,"stroke-linecap":`round`,"stroke-linejoin":`round`})),n}function S(e,t){let{class:n,...r}=t,i=l(16,16);return n!==void 0&&i.classList.add(n),i.append(c(e,r)),i}function C(e){let t=document.createElement(`span`);t.className=`status-icon`,t.dataset.icon=e;for(let n of r[e])t.append(S(n.tag,n.attributes));return t}function w(e,t){e.dataset.icon!==t&&(e.dataset.icon=t,e.replaceChildren(C(t)))}var T={busy:`text-text-muted`,ok:`text-state-done`,error:`text-state-failed`},E=15e3,D=`Something went wrong. Details are hidden in streamer mode.`;function O(e,t){return e!==`error`||t.startsWith(`Not connected to the server. Reconnecting.`)?t:document.documentElement.hasAttribute(`data-streamer`)?D:t}var k={busy:`working`,ok:`complete`,error:`failed`};function A(e){let t=e.querySelector(`:scope > .action-status-icon`),r=e.querySelector(`:scope > .action-status-text`);if(t&&r&&e.childNodes.length===2)return{iconElement:t,textElement:r};let i=n(`span`,`action-status-icon`);i.setAttribute(`aria-hidden`,`true`);let a=n(`span`,`action-status-text`);return e.replaceChildren(i,a),{iconElement:i,textElement:a}}function j(e){e.replaceChildren(),delete e.dataset.tone}function M(e,t,n){if(!n){j(e);return}if(!t){j(e),e.textContent=n;return}e.dataset.tone=t;let{iconElement:r,textElement:i}=A(e);w(r,k[t]),i.textContent=O(t,n)}function N(e=`action-status`){let t=n(`p`,e);return t.setAttribute(`role`,`status`),t.hidden=!0,{element:t,show:(n,r)=>{t.className=`${e} text-xs ${T[n]}`,M(t,n,r),t.hidden=!r},clear:()=>{t.hidden=!0,j(t)}}}function P(t,n){return a(t)?!0:(n.show(`error`,e),!1)}function F(e,t){let n=e instanceof Error?e.message:``;return n===`Request timed out`?`The server did not answer within ${Math.round(t/1e3)} s.`:n||`Not connected to the server. Reconnecting.`}async function I(e,t,n,{busyText:r,timeoutMs:i=E}={}){r&&n.show(`busy`,r);try{let r=await o(e,t,{timeoutMs:i});return n.clear(),r}catch(e){return n.show(`error`,F(e,i)),null}}var L=null,R=3e4,z=null;function B(){let e=document.getElementById(`header-status`),t=document.getElementById(`header-status-text`),n=document.getElementById(`header-status-age`),r=document.getElementById(`header-status-dismiss`);return!e||!t||!n||!r?null:(r.dataset.wired===void 0&&(r.dataset.wired=``,r.addEventListener(`click`,G)),{line:e,text:t,age:n})}function V(){let e=B();if(!e||!L)return;let n=i(Date.now()-L.raisedAt,{...t,justNowBelowSeconds:60});e.age.textContent!==n&&(e.age.textContent=n)}function H({source:e,sessionId:t,message:r,hidesInStreamerMode:i=!0}){let a=B();if(!a)return;let o=i?O(`error`,r):r,s=n(`strong`,`header-status-source`,e);a.text.replaceChildren(s,` ${o}`),a.text.title=`${e}: ${o}`,L={source:e,sessionId:t??null,raisedAt:Date.now()},V(),z??=window.setInterval(V,R),a.line.hidden=!1}function U(e,t){L?.source===e&&(t===void 0||L.sessionId===t)&&G()}function W(e){L?.sessionId===e&&G()}function G(){L=null,z!==null&&window.clearInterval(z),z=null;let e=B();e&&(e.line.hidden=!0,e.text.replaceChildren(),e.text.title=``,e.age.textContent=``)}export{l as C,x as S,y as _,M as a,f as b,I as c,v as d,m as f,d as g,p as h,N as i,P as l,h as m,U as n,H as o,u as p,W as r,F as s,E as t,w as u,g as v,c as w,b as x,_ as y};
@@ -0,0 +1 @@
1
+ import{n as e,o as t,r as n}from"./dom-helpers-xJduxDcc.js";import{H as r,U as i,W as a}from"./index-D6m--U7B.js";var o={mine:`Mine`,run:`Run`,cancel:`Cancel`},s=null;function c(e){return e===null?`n/a`:`${Math.round(e*100)}%`}function l(e){if(e===null)return`n/a`;let t=Math.round(e*100);return t>0?`+${t}`:String(t)}function u(e,n,r){let a=t(`button`,`bench-action-button`,o[n]);return a.type=`button`,a.disabled=r,a.addEventListener(`click`,()=>i(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,i){let{isServerConnected:a,pendingActionBySuite:o,outcomeBySuite:s}=r(),c=t(`div`,`bench-suite`),l=e.inFlight?.suiteId===i.id,f=!!e.inFlight&&!l,m=o.has(i.id)||!a,h=t(`div`,`bench-summary`);h.append(t(`span`,`bench-suite-title`,i.title),n(`bench`,i.caseCount===1?`case`:`cases`,String(i.caseCount)),n(`bench`,i.candidateCount===1?`candidate`:`candidates`,String(i.candidateCount)),n(`bench`,`arms`,String(i.armIds.length))),c.append(h);let g=t(`div`,`bench-controls`),_=e.configured===!0&&i.error===null;g.append(u(i,`mine`,!_||m||l),u(i,`run`,!_||m||l||f||i.caseCount===0),u(i,`cancel`,m||!l));let v=t(`span`,`bench-status`,(a?``:`Not connected to the server. Reconnecting.`)||d(e,i)||s.get(i.id)||``);if(v.setAttribute(`role`,`status`),g.append(v),c.append(g),i.error)return c.append(t(`p`,`bench-error`,i.error)),c;let y=i.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`,i.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}=r(),i=e(`bench`,`Benchmarks`,`Suites from the benchmarks folder of the Glimmervoid home, one run at a time.`);if(s.append(i),!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),a(h),h())}var _={mount:g};export{_ as view};
@@ -0,0 +1 @@
1
+ import{Bt as e,C as t,It as n,Kt as r,Vt as i,bt as a,o,zt as s}from"./dom-helpers-xJduxDcc.js";import{l as c}from"./control-ws-CAcwW-r9.js";import{d as l,m as u}from"./poll-ago-Bc-8mMFj.js";import{C as d,S as f,_ as p,b as m,d as h,g,h as ee,i as _,l as v,p as te,v as y,w as b,x as ne,y as x}from"./action-status-BwqYb9eF.js";import{t as S}from"./roving-keys-core-BDobx2It.js";import{i as C,n as w}from"./modal-mWl2H7A_.js";var T=new Map(Object.entries({WAITING:`now`,COMPLETE:`later`,FAILED:`resting`,IDLE:`resting`,RUNNING:`resting`,STARTING:`resting`,INITIALIZING:`resting`,DORMANT:`resting`,DONE:`resting`}));function E(e){return(typeof e.state==`string`?T.get(e.state):void 0)??`resting`}function D(e,t){return[...e].map(([e,n])=>{let i=n.currentState||r.DORMANT;return{id:e,ui:n,name:t(n),isDormant:i===r.DORMANT,state:i,unseenOutcome:n.unseenOutcome??null,ownerId:n.ownerId??null}})}function O(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 k(e){return O([...e].sort((e,t)=>Number(e.isDormant===!0)-Number(t.isDormant===!0)))}function A({ownerName:e,ownedCount:t}){return e===null?t===1?`Owns 1 session`:t>1?`Owns ${t} sessions`:null:`Owned by ${e}`}function j(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 M({state:e,unseenOutcome:t}){if(e===r.WAITING)return`waiting`;let n=i.safeParse(t);return n.success?n.data:null}function N(e={}){return M(e)!==null}var P=new Map([[`failed`,0],[`waiting`,1],[`finished`,2]]);function F(e){let t=M(e);return t===null?void 0:P.get(t)}function I(e){return e.filter(e=>F(e)!==void 0).sort((e,t)=>(F(e)??0)-(F(t)??0)).map(({id:e})=>e)}function L(e,t){let n=new Map(e.map(e=>[e.id,e]));return I(e).flatMap(e=>{let r=n.get(e),i=r?M(r):null;return!r||i===null||e===t?[]:[{id:e,kind:i,name:r.name??``}]})}var re={headTile:32,tile:26,tileGap:4,overflowSlot:40};function ie(e,t){if(t===0)return 0;let{headTile:n,tile:r,tileGap:i,overflowSlot:a}=re,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))}function ae(e){let t={waitingCount:0,finishedCount:0,failedCount:0};for(let n of e||[]){let e=M(n||{});e===`waiting`&&t.waitingCount++,e===`failed`&&t.failedCount++,e===`finished`&&t.finishedCount++}return t}function oe({waitingCount:e,finishedCount:t,failedCount:n}){return e+n+t}function se({waitingCount:e,failedCount:t}){return e+t}function ce({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 le=new Map([[`hand`,2]]),ue=1;function de(e){return e?typeof e==`string`&&le.get(e)||ue:0}function fe(e){let t=!1,n=0;for(let r of e||[]){let e=de(r);e<=n||(t=typeof r!=`string`||r,n=e)}return t}function R(e){return String(e).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}function z(e,t,n){let r=o(`button`,`popup-menu-item ${n}`);return r.type=`button`,r.setAttribute(`role`,`menuitem`),r.setAttribute(`aria-label`,e),r.append(o(`span`,`popup-menu-item-label`,e),o(`span`,`popup-menu-item-hint`,t)),r}function pe(e){return e.key===`ArrowDown`||e.key===`ArrowUp`}function me(e,t){let n=document.activeElement,r=n instanceof HTMLElement?e.indexOf(n):-1,i=S(t.key,r,e.length,`vertical`);i!==null&&e[i].focus()}function he(e){return e.key===`Home`||e.key===`End`}function B(e){return e.metaKey||e.altKey||e.ctrlKey}function ge(e,t,n){let r=e.relatedTarget;return r instanceof Node&&!t.contains(r)&&!n.contains(r)}function _e({trigger:e,menu:t,menuItems:n,isOpen:r,open:i,close:a,signal:o}){function s(e){e.preventDefault(),e.stopPropagation(),r()||i(),me(n(),e)}e.addEventListener(`keydown`,e=>{!B(e)&&pe(e)&&s(e)},{signal:o}),t.addEventListener(`keydown`,e=>{B(e)||(pe(e)||he(e))&&s(e)},{signal:o}),document.addEventListener(`keydown`,t=>{t.key!==`Escape`||t.defaultPrevented||!r()||C()||(t.preventDefault(),a(),e.focus())},{signal:o});for(let n of[e,t])n.addEventListener(`focusout`,n=>{r()&&ge(n,t,e)&&a()},{signal:o})}var ve=`hover-tip`,ye=`[data-tip-label]`,be=6,xe=8,V=null,H=null;function Se(e){return e instanceof Element?e.closest(ye):null}function Ce(){return V||(V=o(`div`,`hover-tip`),V.id=ve,V.setAttribute(`role`,`tooltip`),V.hidden=!0,document.body.append(V),V)}function we(e,t){let n=o(`span`,`hover-tip-text`);n.append(o(`b`,`hover-tip-label`,t.dataset.tipLabel??``));let r=t.dataset.tipDetail;r&&n.append(o(`span`,`hover-tip-detail`,r));let i=t.querySelector(`svg`)?.cloneNode(!0);e.replaceChildren(...i?[i]:[],n)}function Te(e,t){let n=t.getBoundingClientRect(),r=e.offsetWidth,i=window.innerWidth-r-xe,a=Math.max(xe,Math.min(n.right-r,i));e.style.left=`${a}px`,e.style.top=`${n.bottom+be}px`}function U(e){let t=Ce();H&&H!==e&&H.removeAttribute(`aria-describedby`),H=e,we(t,e),t.hidden=!1,Te(t,e),e.setAttribute(`aria-describedby`,ve)}function W(){H&&(H.removeAttribute(`aria-describedby`),H=null,V&&(V.hidden=!0))}function G(e){H===e&&(!e.dataset.tipLabel||!e.isConnected?W():U(e))}var Ee=!1;function De(){Ee||(Ee=!0,document.addEventListener(`pointerover`,e=>{let t=Se(e.target);t?U(t):W()}),document.addEventListener(`pointerout`,e=>{H&&(e.relatedTarget instanceof Node&&H.contains(e.relatedTarget)||W())}),document.addEventListener(`focusin`,e=>{let t=Se(e.target);t?U(t):W()}),document.addEventListener(`focusout`,W),document.addEventListener(`pointerdown`,W),document.addEventListener(`scroll`,W,!0),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&W()}))}var Oe=new WeakMap;function K(e){let t=Oe.get(e);if(t?.element.parentElement===e.card)return t;let n=t??_(`session-action-status m-0 px-3 py-1`);return e.termWrap.before(n.element),Oe.set(e,n),n}function q(e,t){let n=K(e);return v(t,n)?(n.clear(),!0):!1}var J=!1,Y=new Set;function ke(e){J=!!e,ot();for(let e of Y)e(J)}function Ae(e){return Y.add(e),()=>Y.delete(e)}function je(){return J}var Me=null;function Ne(e){Me=e}var X=null;function Pe(e){X=e}var Fe=null;function Ie(e){Fe=e}function Le(e,t){let n=o(`span`,`tag-icon ${e}`);return n.tabIndex=0,n.setAttribute(`role`,`img`),n.setAttribute(`aria-label`,t),n}function Re(e){let t=d(16,16);return t.classList.add(`line-icon`),t.append(b(`path`,{d:e,fill:`currentColor`})),t}function ze(){let e=f(y,`1.5`);return e.append(b(`path`,{d:p,fill:`currentColor`})),e}function Be(e){return`Runs in Coder workspace ${e}`}function Ve(e,t){let n=t?`Sane YOLO`:`YOLO`;e.setAttribute(`aria-label`,n),e.dataset.tipLabel=n,e.dataset.tipDetail=t?`Skips permission prompts; Sane YOLO blocks catastrophic commands`:`Running with --dangerously-skip-permissions`,e.replaceChildren(t?ze():Re(h)),G(e)}function He(e,t){t&&(e.dataset.saneYolo=``),t||delete e.dataset.saneYolo;let n=e.querySelector(`.perms-badge`);n&&Ve(n,t)}function Ue(e,t){let n=l(e);n&&He(n.card,t)}function We(e,t,n,i={}){let a=n||r.INITIALIZING,s=o(`div`,`session-card`);s.dataset.id=e,s.dataset.session=t,s.dataset.state=a,i.skipPerms&&(s.dataset.skipPerms=``),i.saneYolo&&(s.dataset.saneYolo=``),i.worktree&&(s.dataset.worktree=``),i.workspace&&(s.dataset.workspace=``),i.remoteWorkspace&&(s.dataset.remoteWorkspace=i.remoteWorkspace),i.guarded&&(s.dataset.guarded=``),i.guardrailsReleased&&(s.dataset.guardrailsReleased=``),i.ephemeral&&(s.dataset.ephemeral=``),i.path&&(s.dataset.path=String(i.path));let c=o(`div`,`session-card-header`),l=o(`span`,`session-name`,t);l.title=`Double-click or press F2 to rename`,l.tabIndex=0;let u=i.skipPerms?Le(`perms-badge`,`YOLO`):null;u&&Ve(u,i.saneYolo===!0);let d=o(`span`,`session-task-title`);Z(d,i.taskTitle);let p=o(`div`,`session-actions`),h=o(`div`,`session-overflow`),_=o(`button`,`btn-action btn-session-menu visible`);_.append(f(ee)),_.type=`button`,_.title=`Session actions`,_.setAttribute(`aria-label`,`Session actions`),_.setAttribute(`aria-haspopup`,`menu`),_.setAttribute(`aria-expanded`,`false`);let v=o(`div`,`popup-menu session-overflow-menu`);v.id=`session-menu-${e}`,v.setAttribute(`role`,`menu`),_.setAttribute(`aria-controls`,v.id);let y=z(`Restart...`,`Into this conversation, a fresh one, or an earlier one`,`overflow-restart`);y.setAttribute(`aria-haspopup`,`dialog`);let b=z(`Edit repositories...`,`Add or remove repositories in this workspace`,`overflow-workspace-repos`),x=z(`Link pull request...`,`Link or unlink pull requests for this session`,`overflow-link-pr visible`),S=z(`Conversation view`,`Show this session as messages (experimental)`,`overflow-conversation-view`);S.setAttribute(`role`,`menuitemcheckbox`),S.setAttribute(`aria-checked`,`false`);let C=o(`button`,`tag-icon guardrails-badge`);C.type=`button`,C.setAttribute(`aria-label`,`Guardrails`),Ke(C,s),x.onclick=()=>{v.classList.remove(`open`),_.setAttribute(`aria-expanded`,`false`),qe(e)};let w=z(`Coherence journal`,`Decisions and notes this session recorded`,`overflow-coherence-journal`);w.setAttribute(`aria-haspopup`,`dialog`);let T=()=>w.classList.toggle(`visible`,X?.isReadable(e)===!0);_.onclick=T,_.onkeydown=T,w.onclick=()=>{v.classList.remove(`open`),_.setAttribute(`aria-expanded`,`false`),X?.open(e)};let E=z(`Session setup`,`MCP servers, plugins and hooks this session loaded`,`overflow-session-setup visible`);E.setAttribute(`aria-haspopup`,`dialog`),E.onclick=()=>{v.classList.remove(`open`),_.setAttribute(`aria-expanded`,`false`),Fe?.(e)},v.append(y,b,S,w,E,x),h.append(_,v);let D=o(`button`,`btn-action btn-debug`);D.append(f(g)),D.title=`Debug state`,D.setAttribute(`aria-label`,`Debug session state`);let O=o(`button`,`btn-action btn-trace`);O.append(f(m)),O.type=`button`,O.title=`Trace`,O.setAttribute(`aria-label`,`Trace`);let k=o(`button`,`btn-action btn-remove visible`);k.append(f(te)),k.type=`button`,k.title=`Remove session`,k.setAttribute(`aria-label`,`Remove session`);let A=o(`button`,`btn-action btn-face-plan`,`Plan`);A.type=`button`,A.title=`Show plan`;let j=o(`button`,`btn-action btn-face-plan btn-docs`,`Docs`);j.type=`button`,j.title=`Open docs the agent surfaced`;let M=o(`button`,`btn-action btn-face-plan btn-shown`,`Shown`);M.type=`button`,M.title=`Open files the agent showed you`;let N=o(`span`,`shown-unopened-dot`);N.hidden=!0,N.title=`New shown file`,p.append(N,M,j,A,D,O,h,k);let P=o(`div`,`session-card-tags`),F=Le(`usage-badge`,`Usage`);F.append(f(ne,`2.2`)),u&&P.append(u),P.append(C,F),De();let I=o(`span`,`session-ownership`);I.hidden=!0,c.append(l,d,I,P,p);let L=o(`div`,`terminal-wrap`);return s.append(c,L),{card:s,header:c,nameEl:l,taskTitleEl:d,btnRestart:y,btnSessionMenu:_,btnWorkspaceRepos:b,btnConversationView:S,btnGuardrails:C,btnTrace:O,btnRemove:k,btnPlan:A,btnDocs:j,btnShown:M,shownUnopenedDot:N,btnDebug:D,sessionMenu:v,termWrap:L}}var Ge={on:`Credentials, Glimmervoid state and blocked folders are off-limits to this session.`,released:`This session can read, write and reach anything your account can.`};function Ke(e,t){let n=t.dataset.guarded!==void 0,r=t.dataset.ephemeral===void 0&&(n||t.dataset.guardrailsReleased!==void 0),i=n?` Click to release.`:` Click to restore.`;e.setAttribute(`aria-pressed`,String(n)),e.setAttribute(`aria-disabled`,String(!r)),e.dataset.tipLabel=n?`Guardrails on`:`Guardrails released`,e.dataset.tipDetail=`${n?Ge.on:Ge.released}${r?i:``}`,e.replaceChildren(f(n?y:x,`1.6`)),G(e)}function qe(e){let{dialog:r,close:i,actions:a,btnCancel:s}=w({title:`Link pull request`}),l=o(`p`,`dialog-message`,`Paste a GitHub pull request URL or owner/repo#number.`),u=o(`input`,`dialog-input`);u.type=`text`,u.placeholder=`owner/repo#123`,u.autocomplete=`off`,u.spellcheck=!1,u.setAttribute(`aria-label`,`Pull request URL or owner/repo#number`);let d=o(`div`,`dialog-error`);d.setAttribute(`role`,`alert`);let f=o(`div`,`session-pr-chips dialog-linked-prs`);f.hidden=!0,Me?.(f,e);let p=o(`button`,`btn-dialog btn-dialog-confirm`,`Link`);p.type=`button`,a.append(p),r.append(f,l,u,d,a);function m(){let r=n(u.value);r?c({type:`link-session-pr`,id:e,key:r})?i():d.textContent=t:d.textContent=`Enter a github.com pull request URL or owner/repo#number.`}s.addEventListener(`click`,i),p.addEventListener(`click`,m),u.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.preventDefault(),m())}),requestAnimationFrame(()=>u.focus())}function Je(e,t){e.tabIndex=0,e.setAttribute(`role`,`button`),e.addEventListener(`click`,t),e.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),t())})}function Ye(e,t){let n=e.querySelector(`.session-ownership`);n&&(n.textContent=t??``,n.hidden=t===null)}function Z(e,t){e.title=t??``,t&&e.removeAttribute(`aria-label`),t||e.setAttribute(`aria-label`,`Describe the task`),!e.querySelector(`input`)&&(e.textContent=t??``)}function Xe(e,t){let n=e.titleTargetEl?.isConnected?e.titleTargetEl:e.taskTitleEl;if(n.querySelector(`input`))return;let r=document.createElement(`input`);r.type=`text`,r.className=`session-title-input`,r.setAttribute(`aria-label`,`Task`),r.value=e.taskTitleIsCustom?e.taskTitle??``:``,r.placeholder=e.taskTitle??`What is this session working on?`,r.maxLength=120;let i=n.getAttribute(`role`),a=n.getAttribute(`tabindex`);n.removeAttribute(`role`),n.removeAttribute(`tabindex`),n.replaceChildren(r),r.focus(),r.select();function o(o){r.removeEventListener(`blur`,s),r.removeEventListener(`keydown`,c),o&&q(e,{type:`set-session-title`,id:t,title:r.value.trim()}),n.replaceChildren(),i!==null&&n.setAttribute(`role`,i),a!==null&&n.setAttribute(`tabindex`,a),Z(n,e.taskTitle)}function s(){o(!0)}function c(e){e.stopPropagation(),e.key===`Enter`&&(e.preventDefault(),o(!0)),e.key===`Escape`&&(e.preventDefault(),o(!1))}r.addEventListener(`blur`,s),r.addEventListener(`keydown`,c)}var Ze=`session-rename-input`;function Qe(e){return!!e?.querySelector(`.${Ze}`)}function $e(t,n,{returnsFocusToTerminal:r=!0}={}){let i=t.renameTargetEl?.isConnected?t.renameTargetEl:t.nameEl;if(!i||Qe(i))return;let a=t.card?.dataset.session??i.textContent??``,o=document.createElement(`input`);o.type=`text`,o.className=Ze,o.value=a,o.maxLength=64,i.textContent=``,i.appendChild(o),o.focus(),o.select();let c=K(t);function l(n){return t.card.dataset.ephemeral===void 0?s.test(n)?[...u.values()].some(e=>e!==t&&e.card.dataset.session===n)?`Session "${n}" already exists.`:``:e:`This session cannot be renamed`}function d(e=t.card?.dataset.session??a){i.textContent=e,t.nameEl&&t.nameEl!==i&&(t.nameEl.textContent=e),r&&t.term?.focus()}function f(){let e=o.value.trim(),t=e&&e!==a?l(e):``;t?(c.show(`error`,t),o.select()):p()}function p(){let e=o.value.trim();if(h(),!e||e===a){d();return}let r=l(e);r?(c.show(`error`,r),d()):q(t,{type:`rename-session`,id:n,newName:e})?d(e):d()}function m(){h(),d()}function h(){o.removeEventListener(`blur`,p),o.removeEventListener(`keydown`,g)}function g(e){e.key===`Enter`&&(e.preventDefault(),f()),e.key===`Escape`&&(e.preventDefault(),m()),e.stopPropagation()}o.addEventListener(`blur`,p),o.addEventListener(`keydown`,g)}function et(){let e=o(`button`,`debug-close`);return e.type=`button`,e.title=`Close`,e.setAttribute(`aria-label`,`Close debug overlay`),e.append(f(te)),e}function tt(e){return e?a(new Date(e)):`-`}function Q(e){return`${(Number(e||0)/1e3).toFixed(1)}s`}function nt(e){return e.decision===`gated`?`(${Number(e.active)||0} bg)`:e.decision===`wait`||e.decision===`release`?`(quiet ${Q(e.quietMs)})`:``}function rt(e){let t=`<span class="debug-dim">${tt(e.ts)}</span>`;if(e.kind===`signal`){let n=R([e.signal,e.source].filter(Boolean).join(`/`));return e.action===`transition`?`${t} ${n} → <span class="debug-label">${R(e.event||``)}</span>`:e.action===`gate-held`?`${t} ${n} → held <span class="debug-dim">(${Number(e.active)||0} bg)</span>`:`${t} ${n} → <span class="debug-dim">no-op</span>`}if(e.kind===`gate`){let n=(e.repeats??0)>1?` <span class="debug-dim">x${Number(e.repeats)}</span>`:``,r=nt(e),i=r?` <span class="debug-dim">${r}</span>`:``;return`${t} gate <span class="debug-label">${R(e.decision||`?`)}</span>${i}${n}`}if(e.kind===`notify`){let n=R(e.category||e.to||`?`);return e.category?`${t} notify <span class="debug-label">${n}</span>: fired`:`${t} notify ${n}: <span class="debug-dim">silent (${R(e.reason||``)})</span>`}return e.kind===`notify-state`?`${t} notify ${R(e.category||`?`)}: <span class="debug-dim">${R(e.from||`?`)} → ${R(e.to||`?`)}</span>`:`${t} <span class="debug-dim">${R(e.kind||`decision`)}</span>`}function it(e,t){if(!e.debugOverlay)return;let n=t,r=``;if(r+=`<div class="debug-section"><div class="debug-section-title">State</div>`,r+=`<div class="debug-field"><span class="debug-label">Current:</span> <span class="debug-value">${R(n.state)}</span></div>`,r+=`</div>`,r+=`<div class="debug-section"><div class="debug-section-title">Transitions (last ${n.transitions.length})</div>`,n.transitions.length===0&&(r+=`<div class="debug-field debug-dim">No transitions recorded</div>`),n.transitions.length>0)for(let e of n.transitions){let t=e.detail&&typeof e.detail==`object`?e.detail:null,n=t?[t.signal,t.source,t.deferred?`deferred`:null].filter(Boolean):[],i=n.length>0?` <span class="debug-dim">${R(n.join(`/`))}</span>`:``;r+=`<div class="debug-field"><span class="debug-dim">${tt(e.timestamp)}</span> ${R(e.from)} → ${R(e.to)} <span class="debug-label">${R(e.event)}</span>${i}</div>`}r+=`</div>`;let i=n.detection||{},a=i.lastSignal,o=i.titleState||{};r+=`<div class="debug-section"><div class="debug-section-title">Detection</div>`,r+=`<div class="debug-field"><span class="debug-label">Last signal:</span> <span class="debug-value">${a?`${R(a.signal)} (${R(a.source||`?`)}${a.confidence?`/${R(a.confidence)}`:``})`:`none`}</span></div>`,r+=`<div class="debug-field"><span class="debug-label">Hooks injected:</span> <span class="debug-value">${i.hooksInjected?`yes`:`no`}</span></div>`,r+=`<div class="debug-field"><span class="debug-label">Hook seen:</span> <span class="debug-value">${i.hookSeen?`yes`:`no (degraded → title)`}</span></div>`,r+=`<div class="debug-field"><span class="debug-label">Title state:</span> <span class="debug-value">${R(o.lastKind||`none`)}${o.hasSeenSpinner?` · spun`:``}</span></div>`,r+=`</div>`;let s=i.agents||{},c=i.gate;r+=`<div class="debug-section"><div class="debug-section-title">Agents</div>`,r+=`<div class="debug-field"><span class="debug-label">Active:</span> <span class="debug-value">${Number(s.active)||0} (counted ${Number(s.counted)||0}, declared ${Number(s.declared)||0})</span></div>`,r+=`<div class="debug-field"><span class="debug-label">Idle:</span> <span class="debug-value">${Number(s.idleNames)||0} names, ${Number(s.idleTasks)||0} tasks</span></div>`;let l=c?`held ${Q(c.heldForMs)} (seq ${Number(c.seq)||0}, lastActivity ${Number(c.lastActivitySeq)||0})`:`none`;r+=`<div class="debug-field"><span class="debug-label">Gate:</span> <span class="debug-value">${R(l)}</span></div>`,r+=`</div>`;let u=Array.isArray(n.decisions)?n.decisions:[];r+=`<div class="debug-section"><div class="debug-section-title">Decisions (last ${u.length})</div>`,u.length===0&&(r+=`<div class="debug-field debug-dim">No decisions recorded</div>`);for(let e of u)r+=`<div class="debug-field">${rt(e)}</div>`;r+=`</div>`,e.debugOverlay.innerHTML=r,e.debugOverlay.prepend(et())}function at(e,t){if(e.debugOpen){$(e);return}let n=document.createElement(`div`);n.className=`debug-overlay`,n.innerHTML=`<div class="debug-field debug-dim">Loading...</div>`,n.prepend(et()),e.card.appendChild(n),e.debugOverlay=n,e.debugOpen=!0,n.addEventListener(`click`,t=>{t.stopPropagation(),t.target instanceof Element&&t.target.closest(`.debug-close`)&&$(e)}),c({type:`debug-state`,id:t})}function $(e){e.debugOverlay&&=(e.debugOverlay.remove(),null),e.debugOpen=!1}function ot(){for(let[,e]of u)e.btnDebug.classList.toggle(`visible`,J),e.btnTrace.classList.toggle(`visible`,J),!J&&e.debugOpen&&$(e)}function st(e){let t=typeof e.id==`string`?u.get(e.id):void 0;t?.debugOpen&&it(t,e.payload)}function ct(e){l(e)?.debugOpen&&c({type:`debug-state`,id:e})}export{A,G as C,ce as D,re as E,k as F,j as I,fe as L,oe as M,N,D as O,L as P,E as R,Xe as S,R as T,Ie as _,je as a,Ue as b,Ae as c,Ke as d,Z as f,Pe as g,K as h,st as i,ie as j,ae as k,at as l,q as m,$ as n,Qe as o,Be as p,ct as r,Je as s,We as t,Ye as u,ke as v,_e as w,$e as x,Ne as y,se as z};
@@ -0,0 +1,4 @@
1
+ import{C as e,Ot as t,Pt as n,kt as r}from"./dom-helpers-xJduxDcc.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
+ `).filter(e=>a.test(e)).join(`
3
+ `)}function s(e){return e==null?null:e instanceof Error?{name:(e.name||`Error`).slice(0,128),stack:o(e).slice(0,t)}:{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
+ `)[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(e){let t=c(e,i);return(e,n)=>{let i={scope:e.slice(0,64),text:n.slice(0,r)};t(`${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=7500,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(t,n,{timeoutMs:r=5e3}={}){let i=J(t);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:t,requestId:i,...n})):(clearTimeout(s),F.delete(i),o(Error(e)))})}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 t=M;M=null,Z(),X(e),B&&B(`disconnected`,`Reconnecting`),t?.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 t=L>0?`?since=${L}`:``,r=v(location,j(`/control${t}`)),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(e),a||A(),B&&B(`disconnected`,`Reconnecting`),V?.(`closed`);let t=g(P);P+=1,N=setTimeout($,t)})}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};