glimmervoid 0.44.2 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/bin/glimmervoid.js +8 -8
  2. package/dist/chunks/{adapters-B_ss_kZh.js → adapters-BGuI5U_-.js} +1 -1
  3. package/dist/chunks/{adapters-7AfJ6yb3.js → adapters-D99c4zCx.js} +2 -2
  4. package/dist/chunks/{agent-api-cli-zwuWZlwk.js → agent-api-cli-DIGH1v3_.js} +1 -1
  5. package/dist/chunks/{agent-api-cli-prUJ5ZGN.js → agent-api-cli-DdrR2vnB.js} +1 -1
  6. package/dist/chunks/{agent-api-core-DQwd2ClI.js → agent-api-core-D49OzKho.js} +2 -2
  7. package/dist/chunks/{config-DlKkg6IX.js → config-BLeRKmn9.js} +11 -1
  8. package/dist/chunks/{config-store-DIrwF5iQ.js → config-store-CXLnauAa.js} +2 -2
  9. package/dist/chunks/config-store-DlaaBY9p.js +1 -0
  10. package/dist/chunks/{contracts-lxJ0sQEl.js → contracts-CucdticH.js} +1 -1
  11. package/dist/chunks/{main-BCbulgNv.js → main-CX9CkTDx.js} +203 -31
  12. package/dist/chunks/{pair-cli-B3VRcrHm.js → pair-cli-BPyh48--.js} +2 -2
  13. package/dist/chunks/{remote-config-C91HwjWq.js → remote-config-B0zBDBak.js} +1 -1
  14. package/dist/chunks/{settings-cli-C9eCc60b.js → settings-cli-DzIasX94.js} +4 -4
  15. package/dist/chunks/{settings-readout-core-DK1m5TUq.js → settings-readout-core-BOv6tqdK.js} +1 -1
  16. package/dist/chunks/{ssh-sign-cli-DCnHgHqo.js → ssh-sign-cli-C_QYhDvI.js} +1 -1
  17. package/dist/client/assets/{action-status-DXcC95xv.js → action-status-DrMQzohk.js} +1 -1
  18. package/dist/client/assets/action-status-DrMQzohk.js.br +0 -0
  19. package/dist/client/assets/{benchmark-panel-Cssmnd3z.js → benchmark-panel-D09qvrAY.js} +1 -1
  20. package/dist/client/assets/benchmark-panel-D09qvrAY.js.br +0 -0
  21. package/dist/client/assets/{dom-helpers-CcEFPh-F.js → dom-helpers-CZ8NZKxw.js} +1 -1
  22. package/dist/client/assets/dom-helpers-CZ8NZKxw.js.br +0 -0
  23. package/dist/client/assets/{hooks-panel-Cli8EeBB.js → hooks-panel-R-L7DuIz.js} +1 -1
  24. package/dist/client/assets/hooks-panel-R-L7DuIz.js.br +0 -0
  25. package/dist/client/assets/{index-C8u3ZjM3.js → index-B7TvZo7W.js} +37 -37
  26. package/dist/client/assets/index-B7TvZo7W.js.br +0 -0
  27. package/dist/client/assets/{issues-panel-Bev1wadi.js → issues-panel-CyB4oq9Z.js} +1 -1
  28. package/dist/client/assets/issues-panel-CyB4oq9Z.js.br +0 -0
  29. package/dist/client/assets/{modal-CvDX5-_2.js → modal-M_mJ8--V.js} +1 -1
  30. package/dist/client/assets/modal-M_mJ8--V.js.br +0 -0
  31. package/dist/client/assets/{poll-ago-Dj148faJ.js → poll-ago-ItO-gOWA.js} +1 -1
  32. package/dist/client/assets/poll-ago-ItO-gOWA.js.br +0 -0
  33. package/dist/client/assets/{pr-queue-columns-Jleg5z3W.js → pr-queue-columns-Cu3-PADL.js} +1 -1
  34. package/dist/client/assets/pr-queue-columns-Cu3-PADL.js.br +0 -0
  35. package/dist/client/assets/{radar-panel-Dtp4ZzT3.js → radar-panel-Cl3yPWed.js} +1 -1
  36. package/dist/client/assets/radar-panel-Cl3yPWed.js.br +0 -0
  37. package/dist/client/assets/{review-queue-panel-BQvU_-xl.js → review-queue-panel-CVujzadC.js} +1 -1
  38. package/dist/client/assets/review-queue-panel-CVujzadC.js.br +0 -0
  39. package/dist/client/assets/{settings-panel-DegKCsoZ.js → settings-panel-DW5An8lQ.js} +1 -1
  40. package/dist/client/assets/settings-panel-DW5An8lQ.js.br +0 -0
  41. package/dist/client/assets/{trace-panel-DFqImX92.js → trace-panel-B6TiM5pb.js} +1 -1
  42. package/dist/client/assets/trace-panel-B6TiM5pb.js.br +0 -0
  43. package/dist/client/assets/ui-prefs-CQHZFVx6.js +1 -0
  44. package/dist/client/assets/ui-prefs-CQHZFVx6.js.br +0 -0
  45. package/dist/client/assets/{usage-panel-CEJqXYIA.js → usage-panel-D2RX3LtG.js} +1 -1
  46. package/dist/client/assets/usage-panel-D2RX3LtG.js.br +0 -0
  47. package/dist/client/assets/{visions-panel-Dm3iKlhv.js → visions-panel-BV9EKCBw.js} +1 -1
  48. package/dist/client/assets/visions-panel-BV9EKCBw.js.br +0 -0
  49. package/dist/client/index.html +6 -6
  50. package/dist/client/index.html.br +0 -0
  51. package/dist/server/index.js +1 -1
  52. package/package.json +1 -1
  53. package/dist/chunks/config-store-LYSRHNQs.js +0 -1
  54. package/dist/client/assets/action-status-DXcC95xv.js.br +0 -0
  55. package/dist/client/assets/benchmark-panel-Cssmnd3z.js.br +0 -0
  56. package/dist/client/assets/dom-helpers-CcEFPh-F.js.br +0 -0
  57. package/dist/client/assets/hooks-panel-Cli8EeBB.js.br +0 -0
  58. package/dist/client/assets/index-C8u3ZjM3.js.br +0 -0
  59. package/dist/client/assets/issues-panel-Bev1wadi.js.br +0 -0
  60. package/dist/client/assets/modal-CvDX5-_2.js.br +0 -0
  61. package/dist/client/assets/poll-ago-Dj148faJ.js.br +0 -0
  62. package/dist/client/assets/pr-queue-columns-Jleg5z3W.js.br +0 -0
  63. package/dist/client/assets/radar-panel-Dtp4ZzT3.js.br +0 -0
  64. package/dist/client/assets/review-queue-panel-BQvU_-xl.js.br +0 -0
  65. package/dist/client/assets/settings-panel-DegKCsoZ.js.br +0 -0
  66. package/dist/client/assets/trace-panel-DFqImX92.js.br +0 -0
  67. package/dist/client/assets/ui-prefs-CavQQH-s.js +0 -1
  68. package/dist/client/assets/ui-prefs-CavQQH-s.js.br +0 -0
  69. package/dist/client/assets/usage-panel-CEJqXYIA.js.br +0 -0
  70. package/dist/client/assets/visions-panel-Dm3iKlhv.js.br +0 -0
@@ -4,7 +4,7 @@ import { i as errorText } from "../chunks/text-DoirglWV.js";
4
4
  import { o as packageRoot } from "../chunks/runtime-paths-ghcH9CeW.js";
5
5
  import { t as AGENT_API_VERBS } from "../chunks/session-CUc6d7aS.js";
6
6
  import { i as execSync } from "../chunks/child-process-safe-D4hyVIXj.js";
7
- import { r as agentCommandHelpLines } from "../chunks/agent-api-core-DQwd2ClI.js";
7
+ import { r as agentCommandHelpLines } from "../chunks/agent-api-core-D49OzKho.js";
8
8
  import { t as renderTable } from "../chunks/ascii-figure-core-pDAwtlKO.js";
9
9
  import { n as glimmervoidHomeDir, t as decideConfigPath } from "../chunks/config-path-core-DFt-TemS.js";
10
10
  import { i as parseCommandLine, r as gitDoctorRows, t as probeGitVersion } from "../chunks/git-version-C3lznLS_.js";
@@ -65,7 +65,7 @@ var OWN_SUBCOMMAND_RUNNERS = [
65
65
  return 0;
66
66
  }],
67
67
  ["pair", async (subcommandArgs) => {
68
- const { runPairCli } = await import("../chunks/pair-cli-B3VRcrHm.js");
68
+ const { runPairCli } = await import("../chunks/pair-cli-BPyh48--.js");
69
69
  return runPairCli(subcommandArgs);
70
70
  }],
71
71
  ["agent", async (subcommandArgs) => {
@@ -73,7 +73,7 @@ var OWN_SUBCOMMAND_RUNNERS = [
73
73
  return runAgentSetupCli(subcommandArgs);
74
74
  }],
75
75
  ["settings", async (subcommandArgs) => {
76
- const { runSettingsCli } = await import("../chunks/settings-cli-C9eCc60b.js");
76
+ const { runSettingsCli } = await import("../chunks/settings-cli-DzIasX94.js");
77
77
  return runSettingsCli(subcommandArgs);
78
78
  }],
79
79
  ["visions", async (subcommandArgs) => {
@@ -81,13 +81,13 @@ var OWN_SUBCOMMAND_RUNNERS = [
81
81
  return runVisionsCli(subcommandArgs);
82
82
  }],
83
83
  ["ssh-sign", async (subcommandArgs) => {
84
- const { runSshSignCli } = await import("../chunks/ssh-sign-cli-DCnHgHqo.js");
84
+ const { runSshSignCli } = await import("../chunks/ssh-sign-cli-C_QYhDvI.js");
85
85
  return runSshSignCli(subcommandArgs);
86
86
  }]
87
87
  ];
88
88
  var ownSubcommandNames = new Set(OWN_SUBCOMMAND_RUNNERS.map(([name]) => name));
89
89
  var SUBCOMMAND_RUNNERS = new Map([...OWN_SUBCOMMAND_RUNNERS, ...AGENT_API_VERBS.filter((verb) => !ownSubcommandNames.has(verb)).map((verb) => [verb, async (subcommandArgs, subcommandName) => {
90
- const { runAgentApiCli } = await import("../chunks/agent-api-cli-prUJ5ZGN.js");
90
+ const { runAgentApiCli } = await import("../chunks/agent-api-cli-DdrR2vnB.js");
91
91
  return runAgentApiCli([subcommandName, ...subcommandArgs]);
92
92
  }])]);
93
93
  var AGENT_INSTALL_COMMAND_BY_ID = {
@@ -101,7 +101,7 @@ function missingAgentText(agentId) {
101
101
  }
102
102
  async function printSessionLimits() {
103
103
  if (!process.env["GLIMMERVOID_AGENT_URL"]) return;
104
- const { sessionLimitsHelpLines } = await import("../chunks/agent-api-cli-prUJ5ZGN.js");
104
+ const { sessionLimitsHelpLines } = await import("../chunks/agent-api-cli-DdrR2vnB.js");
105
105
  const limitsLines = await sessionLimitsHelpLines();
106
106
  console.log(`\n${limitsLines.join("\n")}`);
107
107
  }
@@ -158,7 +158,7 @@ async function readDeclaredCustomAgents() {
158
158
  declared: [],
159
159
  error: null
160
160
  };
161
- const { loadConfigFile } = await import("../chunks/config-store-LYSRHNQs.js");
161
+ const { loadConfigFile } = await import("../chunks/config-store-DlaaBY9p.js");
162
162
  try {
163
163
  const loaded = loadConfigFile(decided.path, { exitOnError: false });
164
164
  if (!loaded.config) return {
@@ -234,7 +234,7 @@ async function runDoctor() {
234
234
  }
235
235
  switchSection("Agents");
236
236
  try {
237
- const { listAgentIds, describeAgentResolvability, setCustomAgents } = await import("../chunks/adapters-B_ss_kZh.js");
237
+ const { listAgentIds, describeAgentResolvability, setCustomAgents } = await import("../chunks/adapters-BGuI5U_-.js");
238
238
  const declaredCustomAgents = await readDeclaredCustomAgents();
239
239
  if (declaredCustomAgents.error) line("config", declaredCustomAgents.error);
240
240
  setCustomAgents(declaredCustomAgents.declared);
@@ -1 +1 @@
1
- export { a as describeAgentResolvability, l as listAgentIds, f as setCustomAgents } from "./adapters-7AfJ6yb3.js";
1
+ export { a as describeAgentResolvability, l as listAgentIds, f as setCustomAgents } from "./adapters-D99c4zCx.js";
@@ -1,14 +1,14 @@
1
1
  import { s as relayPath } from "./runtime-paths-ghcH9CeW.js";
2
2
  import { Vt as shortSha$1, zt as FULL_SHA_RE } from "./session-CUc6d7aS.js";
3
3
  import { n as execFileAsync, r as execFileSync } from "./child-process-safe-D4hyVIXj.js";
4
- import { S as InstallFlavor } from "./config-DlKkg6IX.js";
4
+ import { S as InstallFlavor } from "./config-BLeRKmn9.js";
5
5
  import { o as supervisionLine } from "./session-routes--hrsvv7a.js";
6
6
  import { c as textOr, s as rawTextOr } from "./coerce-NSst8oRP.js";
7
7
  import { n as resolveAgentCommand, t as buildAgentSpawnCommand } from "./spawn-command-Cc40FiZI.js";
8
8
  import { r as nextBackoffMs } from "./backoff-DjVpfHk7.js";
9
9
  import { i as isSpinnerChar, n as classifyAgentTitle, r as isBrailleChar, s as buildAgentEnv, t as grok } from "./grok-Di4aQGre.js";
10
10
  import { t as buildHookCommand } from "./hook-command-core-qTNK-xMF.js";
11
- import "./contracts-lxJ0sQEl.js";
11
+ import "./contracts-CucdticH.js";
12
12
  import { n as mergeCodexPreToolUse, t as HOOK_TOOLS } from "./hook-tools-Dl7-r2Eb.js";
13
13
  import fs from "node:fs";
14
14
  import path from "node:path";
@@ -1,7 +1,7 @@
1
1
  import { t as errorCode } from "./text-DoirglWV.js";
2
2
  import { c as AgentLimitsReply, n as AGENT_URL_ENV } from "./session-CUc6d7aS.js";
3
3
  import { i as formatSessionLimits } from "./session-routes--hrsvv7a.js";
4
- import { f as isAgentApiVerb, t as AGENT_COMMAND_HELP } from "./agent-api-core-DQwd2ClI.js";
4
+ import { f as isAgentApiVerb, t as AGENT_COMMAND_HELP } from "./agent-api-core-D49OzKho.js";
5
5
  import { i as resolveHookTarget } from "./hook-relay-core-DA_bz2KA.js";
6
6
  import { n as decideGuardrailsProxy } from "./guardrails-proxy-core-BI3rdY-m.js";
7
7
  import { t as parseJsonOrNull } from "./json-core-dfa_7Fak.js";
@@ -1 +1 @@
1
- export { t as askAgentApi, r as runAgentApiCli, i as sessionLimitsHelpLines } from "./agent-api-cli-zwuWZlwk.js";
1
+ export { t as askAgentApi, r as runAgentApiCli, i as sessionLimitsHelpLines } from "./agent-api-cli-DIGH1v3_.js";
@@ -1,5 +1,5 @@
1
1
  import { R as TASK_TITLE_CONTROL_CHARACTERS, T as RefinedTaskTitle, a as AgentAttentionRequest, d as AgentSendRequest, i as AgentAnswerRequest, l as AgentPullRequestRequest, m as AgentSpawnRequest, o as AgentCloseRequest, p as AgentSettingsRequest, s as AgentEditRequest, t as AGENT_API_VERBS, u as AgentReadRequest } from "./session-CUc6d7aS.js";
2
- import { D as pullRequestKeyFromReference, c as TASK_TITLE_SOURCE_PRIORITY, o as PersistedTaskTitle } from "./config-DlKkg6IX.js";
2
+ import { D as pullRequestKeyFromReference, c as TASK_TITLE_SOURCE_PRIORITY, o as PersistedTaskTitle } from "./config-BLeRKmn9.js";
3
3
  import { n as NO_OWN_WORKTREE_REASON, t as COMMAND_ROUTES } from "./session-routes--hrsvv7a.js";
4
4
  import path from "node:path";
5
5
  import crypto from "node:crypto";
@@ -786,4 +786,4 @@ function agentCommandHelpLines() {
786
786
  return Object.values(AGENT_COMMAND_HELP).map(({ usage, summary }) => ` ${usage.padEnd(Math.max(USAGE_COLUMN_WIDTH, usage.length + 1))}${summary}`);
787
787
  }
788
788
  //#endregion
789
- export { seedTaskTitleSources as A, listRepoWorktreePaths as B, extractPromptTaskTitle as C, parseRefinedTaskTitle as D, parseRefinedSessionName as E, resumePromptFor as F, shouldAdoptReportedResumeId as I, claudeProjectsDir as L, RESUME_ID_RE as M, pickAutoResume as N, resolveRefocusTaskTitle as O, resolveResumeTarget as P, encodeProjectDir as R, extractOscTaskTitle as S, isSubstantivePrompt as T, isAutoNameOf as V, buildTaskTitleRefinementPrompt as _, decideSpawnAllowance as a, decideTaskTitleRefinement as b, describeKeptChildAttention as c, describeUnpushedCloseRefusal as d, isAgentApiVerb as f, buildPersistedTaskTitle as g, projectReviews as h, decideAgentRequest as i, AUTO_CONTINUE_PROMPT as j, resolveTaskTitle as k, describePushLanding as l, projectMyPrs as m, REFUSAL_REASON as n, deriveChildSessionName as o, parseAgentVerb as p, agentCommandHelpLines as r, describeChildEndNote as s, AGENT_COMMAND_HELP as t, describeRoleRefusal as u, chooseRefinedSessionName as v, isSelfWakePrompt as w, extractAiTitle as x, cleanTaskPrompt as y, listRepoConversations as z };
789
+ export { seedTaskTitleSources as A, listRepoWorktreePaths as B, extractPromptTaskTitle as C, parseRefinedTaskTitle as D, parseRefinedSessionName as E, resumePromptFor as F, nextSuggestedName as H, shouldAdoptReportedResumeId as I, claudeProjectsDir as L, RESUME_ID_RE as M, pickAutoResume as N, resolveRefocusTaskTitle as O, resolveResumeTarget as P, encodeProjectDir as R, extractOscTaskTitle as S, isSubstantivePrompt as T, isAutoNameOf as V, buildTaskTitleRefinementPrompt as _, decideSpawnAllowance as a, decideTaskTitleRefinement as b, describeKeptChildAttention as c, describeUnpushedCloseRefusal as d, isAgentApiVerb as f, buildPersistedTaskTitle as g, projectReviews as h, decideAgentRequest as i, AUTO_CONTINUE_PROMPT as j, resolveTaskTitle as k, describePushLanding as l, projectMyPrs as m, REFUSAL_REASON as n, deriveChildSessionName as o, parseAgentVerb as p, agentCommandHelpLines as r, describeChildEndNote as s, AGENT_COMMAND_HELP as t, describeRoleRefusal as u, chooseRefinedSessionName as v, isSelfWakePrompt as w, extractAiTitle as x, cleanTaskPrompt as y, listRepoConversations as z };
@@ -1530,6 +1530,10 @@ var clientVariants = [
1530
1530
  environment: z.string().optional(),
1531
1531
  requestId
1532
1532
  }),
1533
+ loose("quick-session", {
1534
+ id: sessionId,
1535
+ requestId
1536
+ }),
1533
1537
  loose("remove-session", {
1534
1538
  id: sessionId,
1535
1539
  force: z.unknown().optional(),
@@ -1759,6 +1763,7 @@ Object.freeze([
1759
1763
  "state-change",
1760
1764
  "session-added",
1761
1765
  "session-removed",
1766
+ "session-close-confirm",
1762
1767
  "session-renamed",
1763
1768
  "session-title",
1764
1769
  "session-prs",
@@ -1879,7 +1884,8 @@ var serverVariants = [
1879
1884
  requestId,
1880
1885
  ok: z.boolean(),
1881
1886
  error: optionalError,
1882
- reason: z.enum(["not-git"]).optional()
1887
+ reason: z.enum(["not-git"]).optional(),
1888
+ sessionId: z.string().optional()
1883
1889
  }),
1884
1890
  loose("remove-session-result", {
1885
1891
  requestId,
@@ -1937,6 +1943,10 @@ var serverVariants = [
1937
1943
  id: sessionId,
1938
1944
  session: z.string()
1939
1945
  }),
1946
+ loose("session-close-confirm", {
1947
+ id: sessionId,
1948
+ mergeStatus: z.string()
1949
+ }),
1940
1950
  loose("session-renamed", {
1941
1951
  id: sessionId,
1942
1952
  oldName: z.string(),
@@ -1,10 +1,10 @@
1
1
  import { n as errorLabel, r as errorMessage } from "./text-DoirglWV.js";
2
2
  import { n as equalsIgnoringCaseOnWindows } from "./paths-Bu4eH1Yd.js";
3
- import { $ as MEMORY_RESERVE_MB_RANGE, J as FLYING_ANIMALS_DEFAULTS, Q as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, X as FLYING_ANIMALS_GAP_RANGE, Y as FLYING_ANIMALS_DURATION_RANGE, Z as FLYING_ANIMALS_SCALE_RANGE, at as POSTHOG_TRAFFIC_MIN_USERS_RANGE, ct as TASK_TITLE_TIMEOUT_RANGE, d as POST_TURN_CHECK_MODES, dt as USAGE_RETAIN_DAYS_RANGE, et as NON_NEGATIVE_NUMBER_RANGE, f as UPDATE_CHANNELS, ft as USAGE_SCAN_INTERVAL_RANGE, h as normalizeLegacyConfigNumbers, i as Config, it as POSTHOG_TRAFFIC_BASELINE_RANGE, l as configIssueMessage, lt as USAGE_BUDGET_RANGE, mt as WORKFLOWS_MAX_CONCURRENT_SESSIONS_RANGE, n as BUILTIN_AGENT_IDS, nt as POSITIVE_NUMBER_RANGE, ot as POSTHOG_TRAFFIC_MULTIPLIER_RANGE, p as USAGE_COST_MODES, pt as WORKFLOWS_MAX_ACTIONS_PER_POLL_RANGE, rt as POSTHOG_FIX_TIMEOUT_RANGE, s as RUNTIME_CONFIG_SCALAR_KEYS, st as REPLAY_BUFFER_KB_RANGE, t as AGENT_ID_SHAPE_MESSAGE, tt as PORT_RANGE, u as BranchGcFileSettings, ut as USAGE_INTEGER_RANGES } from "./config-DlKkg6IX.js";
3
+ import { $ as MEMORY_RESERVE_MB_RANGE, J as FLYING_ANIMALS_DEFAULTS, Q as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, X as FLYING_ANIMALS_GAP_RANGE, Y as FLYING_ANIMALS_DURATION_RANGE, Z as FLYING_ANIMALS_SCALE_RANGE, at as POSTHOG_TRAFFIC_MIN_USERS_RANGE, ct as TASK_TITLE_TIMEOUT_RANGE, d as POST_TURN_CHECK_MODES, dt as USAGE_RETAIN_DAYS_RANGE, et as NON_NEGATIVE_NUMBER_RANGE, f as UPDATE_CHANNELS, ft as USAGE_SCAN_INTERVAL_RANGE, h as normalizeLegacyConfigNumbers, i as Config, it as POSTHOG_TRAFFIC_BASELINE_RANGE, l as configIssueMessage, lt as USAGE_BUDGET_RANGE, mt as WORKFLOWS_MAX_CONCURRENT_SESSIONS_RANGE, n as BUILTIN_AGENT_IDS, nt as POSITIVE_NUMBER_RANGE, ot as POSTHOG_TRAFFIC_MULTIPLIER_RANGE, p as USAGE_COST_MODES, pt as WORKFLOWS_MAX_ACTIONS_PER_POLL_RANGE, rt as POSTHOG_FIX_TIMEOUT_RANGE, s as RUNTIME_CONFIG_SCALAR_KEYS, st as REPLAY_BUFFER_KB_RANGE, t as AGENT_ID_SHAPE_MESSAGE, tt as PORT_RANGE, u as BranchGcFileSettings, ut as USAGE_INTEGER_RANGES } from "./config-BLeRKmn9.js";
4
4
  import { n as isRecord } from "./coerce-NSst8oRP.js";
5
5
  import { n as glimmervoidHomeDir$1, t as decideConfigPath } from "./config-path-core-DFt-TemS.js";
6
6
  import { d as writeJsonAtomicSync, f as writeTextAtomic, p as writeTextAtomicSync } from "./json-file-DFCTvPjj.js";
7
- import { s as FeatureFlagsResponse, u as TELEMETRY_KILL_SWITCH_FLAG } from "./contracts-lxJ0sQEl.js";
7
+ import { s as FeatureFlagsResponse, u as TELEMETRY_KILL_SWITCH_FLAG } from "./contracts-CucdticH.js";
8
8
  import fs from "node:fs";
9
9
  import path from "node:path";
10
10
  import os from "node:os";
@@ -0,0 +1 @@
1
+ export { s as loadConfigFile } from "./config-store-CXLnauAa.js";
@@ -1,5 +1,5 @@
1
1
  import "./session-CUc6d7aS.js";
2
- import { C as ONBOARDING_STEPS, E as OPERATOR_SURFACES, T as OPERATOR_ACTIONS_BY_SURFACE, n as BUILTIN_AGENT_IDS, w as ONBOARDING_STEP_STATES, x as DASHBOARD_VIEWS } from "./config-DlKkg6IX.js";
2
+ import { C as ONBOARDING_STEPS, E as OPERATOR_SURFACES, T as OPERATOR_ACTIONS_BY_SURFACE, n as BUILTIN_AGENT_IDS, w as ONBOARDING_STEP_STATES, x as DASHBOARD_VIEWS } from "./config-BLeRKmn9.js";
3
3
  import { z } from "zod";
4
4
  //#region shared/contracts/telemetry.ts
5
5
  var TELEMETRY_ADAPTERS = Object.freeze([...BUILTIN_AGENT_IDS, "custom"]);
@@ -4,9 +4,9 @@ import { a as sanitizeWorktreeName, i as safePathSegment, n as equalsIgnoringCas
4
4
  import { c as resolvePackageBin, i as clientDir, n as bundled, o as packageRoot, r as cliPath, s as relayPath, t as assetRoot } from "./runtime-paths-ghcH9CeW.js";
5
5
  import { $ as MyPrMergeWhenReadyRequest, $t as RESTARTABLE_STATES, A as SESSION_NAME_RULE_TEXT, At as TeamReviewStateEntry, Bt as HEX_SHA_RE, C as ConversationQuestion, Ct as ReviewResult, D as SESSION_DOC_BODY_CAP_BYTES, Et as TeamReviewActionRequest, Ft as canApproveAfterComment, G as MyPrCheckContextsResponse, Gt as repoParts, H as MyPr, Ht as GH_SEGMENT, It as decisionAsIfApprovalRequired, J as MyPrLaneEntry, K as MyPrKeepMergeableRequest, L as SshSignRequest, M as SSH_SIGN_BODY_CAP_BYTES, Mt as TeamReviewThreadCommentsResponse, Nt as TeamReviewThreadResult, Ot as TeamReviewCompareFiles, Pt as TeamReviewThreadsRepository, Q as MyPrMergeStateResponse, Qt as MERGEABLE_LIVE_STATES, Rt as hasStandingViewerApproval, St as ReviewFinding, Tt as ReviewVerdict, U as MyPrAutoRebase, Ut as NODE_ID_RE, V as LinkedPr, Vt as shortSha, W as MyPrCheckContext, Wt as REPO_SLUG_RE, X as MyPrMergeRequest, Xt as BADGE_LABELS, Y as MyPrMergeMethod, Zt as KILLABLE_STATES, _ as CONVERSATION_PERMISSION_HOOK_EVENT, _t as PrDetail, at as MyPrsState, bt as ReviewComment, dt as DECIDING_REVIEW_STATES, en as STATES, ft as EarlierReview, g as CONVERSATION_APPROVAL_SUMMARY_MAX_CHARS, gt as PostingPlan, h as COHERENCE_HOOKS_INACTIVE, ht as GithubReviewState, it as MyPrsSnapshot, j as SIGN_URL_ENV, jt as TeamReviewStatus, k as SESSION_NAME_PATTERN, kt as TeamReviewResolveResponse, n as AGENT_URL_ENV, nt as MyPrThreadNode, pt as FindingSeverity, r as ASK_USER_QUESTION_TOOL_NAME, rt as MyPrThreadsResponse, ut as CommitSha, v as CONVERSATION_TOOL_RESULT_HOOK_EVENT, vt as QueuedReview, wt as ReviewThreadId, xt as ReviewDraft, z as TaskTitle } from "./session-CUc6d7aS.js";
6
6
  import { n as execFileAsync, o as spawn, r as execFileSync, t as execFile } from "./child-process-safe-D4hyVIXj.js";
7
- import { A as BenchmarkId, At as parseExitPlanModeHookPayload, B as GithubPrKey, Ct as PLAN_BODY_CAP_BYTES, D as pullRequestKeyFromReference, Dt as PLAN_TOOL_NAME, Et as PLAN_RESULT_HOOK_EVENT, F as CommitComparison, Ft as IssueUpdate, G as WorkflowLabelName, H as GithubPrsFrame, I as MergedPrListing, It as IssuesSearchResponse, K as WorkflowsSettings, L as MinedPrReviewData, Lt as IssuesState, M as BenchmarkRun, Mt as GithubIssuePullRequestsRepository, N as BenchmarkStatus, Nt as GithubIssueResponse, O as BenchmarkActionRequest, Ot as PlanDecision, P as BenchmarkSuite, Pt as IssueKey, Q as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, R as PrCheckoutCaseInput, Rt as IssuesStatus, St as changeMapFactId, Tt as PLAN_HOOK_OUTPUT_MAX_CHARS, U as comparablePrKey, V as GithubPrLightSearchNode, W as WorkflowCommentBody, _t as MAX_RAW_LINE_CHARS, a as ConfigUpdate, b as ClientMessage, bt as CoherenceJournalOutput, g as CHANGES_POLL_INTERVAL_MS, gt as SessionSetup, ht as UpdateJournal, j as BenchmarkJudgement, jt as planTitle, k as BenchmarkCase, kt as PlanRevision, l as configIssueMessage, m as USAGE_VENDOR_KEYS, p as USAGE_COST_MODES, q as WorkflowsState, r as BrowserConfig, s as RUNTIME_CONFIG_SCALAR_KEYS, ut as USAGE_INTEGER_RANGES, v as CLIENT_LOG_TEXT_MAX_CHARS, vt as TraceCheckpoint, wt as PLAN_HOOK_EVENT, xt as ChangeMap, y as CONTROL_FRAME_MAX_BYTES, yt as TraceRecord, z as GithubPrDetailNode, zt as issuePullRequestStateFromGithub } from "./config-DlKkg6IX.js";
7
+ import { A as BenchmarkId, At as parseExitPlanModeHookPayload, B as GithubPrKey, Ct as PLAN_BODY_CAP_BYTES, D as pullRequestKeyFromReference, Dt as PLAN_TOOL_NAME, Et as PLAN_RESULT_HOOK_EVENT, F as CommitComparison, Ft as IssueUpdate, G as WorkflowLabelName, H as GithubPrsFrame, I as MergedPrListing, It as IssuesSearchResponse, K as WorkflowsSettings, L as MinedPrReviewData, Lt as IssuesState, M as BenchmarkRun, Mt as GithubIssuePullRequestsRepository, N as BenchmarkStatus, Nt as GithubIssueResponse, O as BenchmarkActionRequest, Ot as PlanDecision, P as BenchmarkSuite, Pt as IssueKey, Q as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, R as PrCheckoutCaseInput, Rt as IssuesStatus, St as changeMapFactId, Tt as PLAN_HOOK_OUTPUT_MAX_CHARS, U as comparablePrKey, V as GithubPrLightSearchNode, W as WorkflowCommentBody, _t as MAX_RAW_LINE_CHARS, a as ConfigUpdate, b as ClientMessage, bt as CoherenceJournalOutput, g as CHANGES_POLL_INTERVAL_MS, gt as SessionSetup, ht as UpdateJournal, j as BenchmarkJudgement, jt as planTitle, k as BenchmarkCase, kt as PlanRevision, l as configIssueMessage, m as USAGE_VENDOR_KEYS, p as USAGE_COST_MODES, q as WorkflowsState, r as BrowserConfig, s as RUNTIME_CONFIG_SCALAR_KEYS, ut as USAGE_INTEGER_RANGES, v as CLIENT_LOG_TEXT_MAX_CHARS, vt as TraceCheckpoint, wt as PLAN_HOOK_EVENT, xt as ChangeMap, y as CONTROL_FRAME_MAX_BYTES, yt as TraceRecord, z as GithubPrDetailNode, zt as issuePullRequestStateFromGithub } from "./config-BLeRKmn9.js";
8
8
  import { a as permitsHelpCommand, r as describeSessionLimits } from "./session-routes--hrsvv7a.js";
9
- import { A as seedTaskTitleSources, B as listRepoWorktreePaths, C as extractPromptTaskTitle, D as parseRefinedTaskTitle, E as parseRefinedSessionName, F as resumePromptFor, I as shouldAdoptReportedResumeId, L as claudeProjectsDir, M as RESUME_ID_RE, N as pickAutoResume, O as resolveRefocusTaskTitle, P as resolveResumeTarget, R as encodeProjectDir, S as extractOscTaskTitle, T as isSubstantivePrompt, V as isAutoNameOf, _ as buildTaskTitleRefinementPrompt, a as decideSpawnAllowance, b as decideTaskTitleRefinement, c as describeKeptChildAttention, d as describeUnpushedCloseRefusal, g as buildPersistedTaskTitle, h as projectReviews, i as decideAgentRequest, j as AUTO_CONTINUE_PROMPT, k as resolveTaskTitle, l as describePushLanding, m as projectMyPrs, n as REFUSAL_REASON, o as deriveChildSessionName, p as parseAgentVerb, s as describeChildEndNote, u as describeRoleRefusal, v as chooseRefinedSessionName, w as isSelfWakePrompt, x as extractAiTitle, y as cleanTaskPrompt, z as listRepoConversations } from "./agent-api-core-DQwd2ClI.js";
9
+ import { A as seedTaskTitleSources, B as listRepoWorktreePaths, C as extractPromptTaskTitle, D as parseRefinedTaskTitle, E as parseRefinedSessionName, F as resumePromptFor, H as nextSuggestedName, I as shouldAdoptReportedResumeId, L as claudeProjectsDir, M as RESUME_ID_RE, N as pickAutoResume, O as resolveRefocusTaskTitle, P as resolveResumeTarget, R as encodeProjectDir, S as extractOscTaskTitle, T as isSubstantivePrompt, V as isAutoNameOf, _ as buildTaskTitleRefinementPrompt, a as decideSpawnAllowance, b as decideTaskTitleRefinement, c as describeKeptChildAttention, d as describeUnpushedCloseRefusal, g as buildPersistedTaskTitle, h as projectReviews, i as decideAgentRequest, j as AUTO_CONTINUE_PROMPT, k as resolveTaskTitle, l as describePushLanding, m as projectMyPrs, n as REFUSAL_REASON, o as deriveChildSessionName, p as parseAgentVerb, s as describeChildEndNote, u as describeRoleRefusal, v as chooseRefinedSessionName, w as isSelfWakePrompt, x as extractAiTitle, y as cleanTaskPrompt, z as listRepoConversations } from "./agent-api-core-D49OzKho.js";
10
10
  import { a as positiveIntOr, c as textOr, i as numberOr, n as isRecord, o as positiveNumberOr, r as nonNegativeIntOr, s as rawTextOr, t as coercedNumberOr } from "./coerce-NSst8oRP.js";
11
11
  import { n as glimmervoidHomeDir, t as decideConfigPath } from "./config-path-core-DFt-TemS.js";
12
12
  import { i as parseCommandLine, n as warnWhenGitIsTooOld } from "./git-version-C3lznLS_.js";
@@ -21,13 +21,13 @@ import { n as DEFAULT_MAX_MS, r as nextBackoffMs, t as DEFAULT_BASE_MS } from ".
21
21
  import { n as unrefTimer, t as DEFAULT_TIMER_FNS } from "./timer-deps-u2DAQLok.js";
22
22
  import { n as shellQuote } from "./hook-command-core-qTNK-xMF.js";
23
23
  import { C as parseCgroupBytes, S as memoryReserveBytes, T as parseMemAvailableBytes, _ as createSpawnGate, a as jsonStateLoadError, b as cgroupLimitBytes, c as loadedJsonValue, d as writeJsonAtomicSync, f as writeTextAtomic, g as createSerialQueue, h as createMemoryAdmission, i as createJsonStateWriter, m as createKeyedSerialQueue, n as appendJsonLines, o as loadJsonStateFile, p as writeTextAtomicSync, r as createJsonStateStore, s as loadJsonStateFileSync, t as appendJsonLine, u as writeJsonAtomic, v as isQueueAdmissionTimeout, w as parseCgroupV2Path, x as headroomFromReadings, y as cgroupAncestorPaths } from "./json-file-DFCTvPjj.js";
24
- import { B as buildExceptionProperties, F as TELEMETRY_BATCH_URL, G as decideIsDevInstall, H as classifySessionExit, I as TELEMETRY_FLAGS_URL, J as exceptionFingerprint, K as decideRemoteTelemetryState, L as adapterBucket, P as FIRST_RUN_NOTICE, R as buildAiGenerationEvents, U as claudeAccountUuidOf, V as buildPersonProperties, W as codexUserIdOf, X as parsePosthogReleaseId, Y as nodeMajorVersion, Z as resolveProjectToken, a as generateProjectId, at as planWorktreeGc, b as validateSettingsBlock, ct as worktreeIntegrationTips, d as assetForPlatform, dt as isSameDirectoryPath, et as stableConfigKey, f as decideRtkInstall, g as verifyDigest, h as isRtkBinaryName, i as ensureProjectIds, it as planBranchGc, lt as canonicalizePath, m as installTargetPath, n as DEFAULT_CONFIG, nt as DEFAULT_BRANCH_GC_PREFIXES, o as glimmervoidHomeDir$1, ot as sessionIdFromBranch, p as findEscapingArchiveMember, q as decideTelemetryConsent, r as createConfigStore, rt as matchedPrefix, st as usablePrefixes, t as ABORT_CONFIG_SAVE, ut as comparableDirectoryPath, v as mergeSettingsBlock, y as settingsBlockSpecFor, z as buildBrowserExceptionProperties } from "./config-store-DIrwF5iQ.js";
25
- import { a as parseDataClientMessage, c as PendingCrashReport, d as TelemetryState, i as parseDataAttach, l as TELEMETRY_EVENT_SCHEMAS, n as HookEnvelope, o as DashboardTelemetryReport, r as DEEP_HISTORY_SCROLLBACK_LINES, t as HTTP_URL_RE } from "./contracts-lxJ0sQEl.js";
26
- import { A as dedupeCodexFiles, B as shouldPersistWarehouse, C as shortSha$1, D as codexSessionIdFromPath, E as codexRootCandidates, F as passOutcome, H as claudeCode, I as projectDirCandidates, L as resolveProjectsDirs, M as grokHomes, N as grokRootCandidates, O as continuationDelayMs, P as isUsageFile, R as scopedClaudeRoots, S as parseResolvedSha, T as codexHomes, V as splitLines$1, _ as isCheckFresh, a as describeAgentResolvability, b as parseRegistryDeprecation, c as isKnownAgentId, d as resolveAdapter, f as setCustomAgents, g as decideUpdateStatus, h as decideInstallFlavor, i as customAgentFingerprint, j as expandTilde, k as decideFileRead, l as listAgentIds, m as readHostCodexVersion, n as cachedAgentResolvability, o as getAdapter, p as codex, r as commandFor, s as hookProfileOf, t as DEFAULT_AGENT_ID, u as resetCommandCache, v as normalizeSha, w as codexFallbackRoots, x as parseRegistryLatest, y as normalizeUpdateChannel, z as shouldEvaluateDespiteIoFailures } from "./adapters-7AfJ6yb3.js";
24
+ import { B as buildExceptionProperties, F as TELEMETRY_BATCH_URL, G as decideIsDevInstall, H as classifySessionExit, I as TELEMETRY_FLAGS_URL, J as exceptionFingerprint, K as decideRemoteTelemetryState, L as adapterBucket, P as FIRST_RUN_NOTICE, R as buildAiGenerationEvents, U as claudeAccountUuidOf, V as buildPersonProperties, W as codexUserIdOf, X as parsePosthogReleaseId, Y as nodeMajorVersion, Z as resolveProjectToken, a as generateProjectId, at as planWorktreeGc, b as validateSettingsBlock, ct as worktreeIntegrationTips, d as assetForPlatform, dt as isSameDirectoryPath, et as stableConfigKey, f as decideRtkInstall, g as verifyDigest, h as isRtkBinaryName, i as ensureProjectIds, it as planBranchGc, lt as canonicalizePath, m as installTargetPath, n as DEFAULT_CONFIG, nt as DEFAULT_BRANCH_GC_PREFIXES, o as glimmervoidHomeDir$1, ot as sessionIdFromBranch, p as findEscapingArchiveMember, q as decideTelemetryConsent, r as createConfigStore, rt as matchedPrefix, st as usablePrefixes, t as ABORT_CONFIG_SAVE, ut as comparableDirectoryPath, v as mergeSettingsBlock, y as settingsBlockSpecFor, z as buildBrowserExceptionProperties } from "./config-store-CXLnauAa.js";
25
+ import { a as parseDataClientMessage, c as PendingCrashReport, d as TelemetryState, i as parseDataAttach, l as TELEMETRY_EVENT_SCHEMAS, n as HookEnvelope, o as DashboardTelemetryReport, r as DEEP_HISTORY_SCROLLBACK_LINES, t as HTTP_URL_RE } from "./contracts-CucdticH.js";
26
+ import { A as dedupeCodexFiles, B as shouldPersistWarehouse, C as shortSha$1, D as codexSessionIdFromPath, E as codexRootCandidates, F as passOutcome, H as claudeCode, I as projectDirCandidates, L as resolveProjectsDirs, M as grokHomes, N as grokRootCandidates, O as continuationDelayMs, P as isUsageFile, R as scopedClaudeRoots, S as parseResolvedSha, T as codexHomes, V as splitLines$1, _ as isCheckFresh, a as describeAgentResolvability, b as parseRegistryDeprecation, c as isKnownAgentId, d as resolveAdapter, f as setCustomAgents, g as decideUpdateStatus, h as decideInstallFlavor, i as customAgentFingerprint, j as expandTilde, k as decideFileRead, l as listAgentIds, m as readHostCodexVersion, n as cachedAgentResolvability, o as getAdapter, p as codex, r as commandFor, s as hookProfileOf, t as DEFAULT_AGENT_ID, u as resetCommandCache, v as normalizeSha, w as codexFallbackRoots, x as parseRegistryLatest, y as normalizeUpdateChannel, z as shouldEvaluateDespiteIoFailures } from "./adapters-D99c4zCx.js";
27
27
  import { t as HOOK_TOOLS } from "./hook-tools-Dl7-r2Eb.js";
28
28
  import { a as formatSshPublicKey, c as orderAgentSockets, i as commitSigningShimText, l as parseSshPublicKey, n as NO_AGENT_HOLDS_KEY, o as isForwardedAgentDirName, r as agentListsKey, s as isSignableGitObject, t as COMMIT_SIGNING_SHIM_NAME } from "./ssh-signing-core-CRhVVWNW.js";
29
- import { a as configSiblingPath, c as defaultPairingsPath, d as decideDeviceAuth, f as deviceNameFromUserAgent, l as defaultSeenPath, n as normalizeRemoteConfig, o as createPairingsStore, p as hashSecret, r as validateRemoteConfig, s as createSeenStore, t as decideBindHost, u as DEFAULT_DEVICE_MAX_AGE_MS } from "./remote-config-C91HwjWq.js";
30
- import { n as configFileViewOf, u as readSettingsForAgent } from "./settings-readout-core-DK1m5TUq.js";
29
+ import { a as configSiblingPath, c as defaultPairingsPath, d as decideDeviceAuth, f as deviceNameFromUserAgent, l as defaultSeenPath, n as normalizeRemoteConfig, o as createPairingsStore, p as hashSecret, r as validateRemoteConfig, s as createSeenStore, t as decideBindHost, u as DEFAULT_DEVICE_MAX_AGE_MS } from "./remote-config-B0zBDBak.js";
30
+ import { n as configFileViewOf, u as readSettingsForAgent } from "./settings-readout-core-BOv6tqdK.js";
31
31
  import { _ as escapeMarkup, g as createLaneLog, n as createVisionsSetup } from "./visions-setup-VMMyqOpl.js";
32
32
  import { t as getRtkPath } from "./rtk-resolver-BDHi6RMv.js";
33
33
  import { createRequire } from "node:module";
@@ -4737,7 +4737,13 @@ function createAgentApiWiring({ config, agentSessions, listAllSessions, listBoar
4737
4737
  if (roleRefusal) return roleRefusal;
4738
4738
  return dispatch(session, parsed.verb, parsed.request);
4739
4739
  }
4740
- return { handle };
4740
+ function markChildWorktreeDiscard(childId) {
4741
+ childIdsToDiscard.add(childId);
4742
+ }
4743
+ return {
4744
+ handle,
4745
+ markChildWorktreeDiscard
4746
+ };
4741
4747
  }
4742
4748
  //#endregion
4743
4749
  //#region server/remote-setup-wiring.ts
@@ -5984,6 +5990,15 @@ function decideAcknowledge(isAcknowledgeDeferred, from, event, isIdleCompactionA
5984
5990
  };
5985
5991
  }
5986
5992
  //#endregion
5993
+ //#region session/core/exit-close.ts
5994
+ var UNMERGED_MERGE_STATUSES = /* @__PURE__ */ new Set(["pending-review", "parked"]);
5995
+ function decideExitClose(facts) {
5996
+ if (!facts.exitedOnItsOwn || !facts.isConfiguredSession) return "keep";
5997
+ if (facts.isWorkspace || facts.hasRemoteEnvironment) return "confirm";
5998
+ if (UNMERGED_MERGE_STATUSES.has(facts.mergeStatus)) return "confirm";
5999
+ return "remove";
6000
+ }
6001
+ //#endregion
5987
6002
  //#region session/core/claude-approval-core.ts
5988
6003
  var MAIN_AGENT_KEY$1 = "";
5989
6004
  var SESSION_DESTINATION = "session";
@@ -7064,7 +7079,7 @@ function createSessionEventWiring(dependencies) {
7064
7079
  dependencies.logger.error(`[${session.name}] error: ${errorMessage(error)}`);
7065
7080
  dependencies.telemetry?.captureException(error, { handled: true });
7066
7081
  });
7067
- session.on("exit", ({ exitCode, signal, reason }) => {
7082
+ session.on("exit", ({ exitCode, signal, reason, exitedOnItsOwn }) => {
7068
7083
  if (postTurnDebounce) {
7069
7084
  clearTimeout(postTurnDebounce);
7070
7085
  postTurnDebounce = null;
@@ -7077,7 +7092,28 @@ function createSessionEventWiring(dependencies) {
7077
7092
  signal,
7078
7093
  reason
7079
7094
  }));
7095
+ closeSessionAfterExit(exitedOnItsOwn === true);
7080
7096
  });
7097
+ function closeSessionAfterExit(exitedOnItsOwn) {
7098
+ const project = dependencies.config.projects.find((candidate) => candidate.id === session.id);
7099
+ const exitClose = decideExitClose({
7100
+ exitedOnItsOwn,
7101
+ isConfiguredSession: project !== void 0,
7102
+ mergeStatus: session.mergeStatus,
7103
+ isWorkspace: session.isWorkspace,
7104
+ hasRemoteEnvironment: Boolean(project?.environment)
7105
+ });
7106
+ if (exitClose === "remove") {
7107
+ dependencies.logger.log(`[${session.name}] agent quit on its own, removing the session`);
7108
+ dependencies.removeExitedSession?.(session.id);
7109
+ return;
7110
+ }
7111
+ if (exitClose === "confirm") dependencies.broadcastControl({
7112
+ type: "session-close-confirm",
7113
+ id: session.id,
7114
+ mergeStatus: session.mergeStatus
7115
+ });
7116
+ }
7081
7117
  session.on("teardown", ({ cause }) => {
7082
7118
  clearCompactionConfirm();
7083
7119
  isAcknowledgeDeferredForCompaction = false;
@@ -21206,7 +21242,7 @@ var Session = class extends EventEmitter {
21206
21242
  const remoteExitReason = await pendingRemoteExitReason;
21207
21243
  if (remoteExitReason && this._isExitHeadedForFailure(event)) this.failureReason = remoteExitReason;
21208
21244
  }
21209
- this.transition(event, detail);
21245
+ const isUnsignalledCleanExit = this.transition(event, detail) && event === "process_exit_ok" && !signal;
21210
21246
  if (this._recorder) {
21211
21247
  this._recorder.writeFooter("pty_exit", exitCode);
21212
21248
  this._recorder.finishRecordingFile();
@@ -21214,10 +21250,12 @@ var Session = class extends EventEmitter {
21214
21250
  try {
21215
21251
  await this._settleWorktreeOnExit();
21216
21252
  } catch {}
21253
+ const exitedOnItsOwn = isUnsignalledCleanExit && this.state === STATES.DONE && !this._teardownPending() && !this._destroyed;
21217
21254
  this.emit("exit", {
21218
21255
  exitCode,
21219
21256
  signal,
21220
- reason
21257
+ reason,
21258
+ exitedOnItsOwn
21221
21259
  });
21222
21260
  }
21223
21261
  getScreenSnapshot() {
@@ -49887,6 +49925,55 @@ function deriveIssueSessionName(issue) {
49887
49925
  return sanitizeSessionName(`issue-${issueNumber}-${String(issue.title ?? "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "untitled"}`) || `issue-${issueNumber}`;
49888
49926
  }
49889
49927
  //#endregion
49928
+ //#region server/session/core/quick-session-core.ts
49929
+ var COPIED_RUN_SETTINGS = [
49930
+ "baseBranch",
49931
+ "codexBypassHookTrust",
49932
+ "conversationView"
49933
+ ];
49934
+ var AUTO_NAME_SUFFIX = / \(\d+\)$/;
49935
+ function autoNameBase(name) {
49936
+ return name.replace(AUTO_NAME_SUFFIX, "");
49937
+ }
49938
+ function runSettingsOf(project) {
49939
+ const runSettings = {};
49940
+ for (const field of COPIED_RUN_SETTINGS) if (project[field] !== void 0) Object.assign(runSettings, { [field]: project[field] });
49941
+ return runSettings;
49942
+ }
49943
+ function requestFromLiveSession(live, name) {
49944
+ const repos = live.workspaceRepos && live.workspaceRepos.length >= 2 ? [...live.workspaceRepos] : void 0;
49945
+ return {
49946
+ name,
49947
+ path: repos?.[0] ?? live.path,
49948
+ repos,
49949
+ agent: live.agentId,
49950
+ dangerouslySkipPermissions: live.dangerouslySkipPermissions,
49951
+ unguarded: live.isMarkedUnguarded && !live.isGuardrailsReleased
49952
+ };
49953
+ }
49954
+ function requestFromProject(project, live, name) {
49955
+ return {
49956
+ name,
49957
+ path: project.repos?.[0] ?? project.path,
49958
+ repos: project.repos ? [...project.repos] : void 0,
49959
+ agent: project.agent,
49960
+ dangerouslySkipPermissions: project.dangerouslySkipPermissions,
49961
+ unguarded: project.unguarded === true && !live.isGuardrailsReleased,
49962
+ environment: project.environment?.name
49963
+ };
49964
+ }
49965
+ function planQuickSession({ live, project, sessionNames }) {
49966
+ const name = nextSuggestedName(autoNameBase(live.name), sessionNames);
49967
+ if (!project) return {
49968
+ request: requestFromLiveSession(live, name),
49969
+ runSettings: {}
49970
+ };
49971
+ return {
49972
+ request: requestFromProject(project, live, name),
49973
+ runSettings: runSettingsOf(project)
49974
+ };
49975
+ }
49976
+ //#endregion
49890
49977
  //#region server/settings-payload.ts
49891
49978
  function summarizeCustomAgents(declarations) {
49892
49979
  return declarations.map((declaration) => ({
@@ -51466,6 +51553,12 @@ function requestValidationErrorReply(msg, message) {
51466
51553
  ok: false,
51467
51554
  error: message
51468
51555
  }),
51556
+ "quick-session": () => ({
51557
+ type: "add-session-result",
51558
+ requestId,
51559
+ ok: false,
51560
+ error: message
51561
+ }),
51469
51562
  "remove-session": () => ({
51470
51563
  type: "remove-session-result",
51471
51564
  requestId,
@@ -51538,7 +51631,7 @@ function parseSinceParam(url) {
51538
51631
  return Number.isFinite(n) ? n : null;
51539
51632
  }
51540
51633
  function registerControlHandlers(controlWss, deps) {
51541
- const { sessions, agentSessions = /* @__PURE__ */ new Map(), config, configStore, broadcastControl, generateProjectId, applyConfigReload, applySettingsReload, requestShutdown, requestRestart, handleClientFocus, buildHealthSnapshot, getUpdateStatus, getUpdateJournal = null, getPostTurnLeftoversNotice = null, recheckPostTurnLeftovers = null, checkNow = null, applyUpdate = null, noteRestartRequested = null, getRadarStatus, posthogReportsDir = null, posthogSetIssueStatus = null, radarArchiveInvestigation = null, getTeamReviewStatus = null, getMyPrsStatus = null, getIssuesStatus = null, githubStore = null, issues = null, teamReview = null, myPrs = null, getBenchmarkStatus = null, benchmarks = null, requestIssue = async () => ({
51634
+ const { sessions, agentSessions = /* @__PURE__ */ new Map(), markChildWorktreeDiscard = null, config, configStore, broadcastControl, generateProjectId, applyConfigReload, applySettingsReload, requestShutdown, requestRestart, handleClientFocus, buildHealthSnapshot, getUpdateStatus, getUpdateJournal = null, getPostTurnLeftoversNotice = null, recheckPostTurnLeftovers = null, checkNow = null, applyUpdate = null, noteRestartRequested = null, getRadarStatus, posthogReportsDir = null, posthogSetIssueStatus = null, radarArchiveInvestigation = null, getTeamReviewStatus = null, getMyPrsStatus = null, getIssuesStatus = null, githubStore = null, issues = null, teamReview = null, myPrs = null, getBenchmarkStatus = null, benchmarks = null, requestIssue = async () => ({
51542
51635
  isRateLimited: false,
51543
51636
  value: {
51544
51637
  ok: false,
@@ -51604,6 +51697,27 @@ function registerControlHandlers(controlWss, deps) {
51604
51697
  }
51605
51698
  return createAddedSessionOnceWorktreeCapable(msg, ws);
51606
51699
  }
51700
+ function handleQuickSession(msg, ws) {
51701
+ const source = findSession(msg);
51702
+ if (!source) {
51703
+ replyTo(ws, msg, "add-session-result", {
51704
+ ok: false,
51705
+ error: "The session to copy no longer exists."
51706
+ });
51707
+ return;
51708
+ }
51709
+ const plan = planQuickSession({
51710
+ live: source,
51711
+ project: config.projects.find((project) => project.id === source.id) ?? null,
51712
+ sessionNames: [...sessions.values(), ...agentSessions.values()].map((session) => session.name)
51713
+ });
51714
+ return handleAddSession({
51715
+ type: "add-session",
51716
+ requestId: msg.requestId,
51717
+ ...plan.request,
51718
+ runSettings: plan.runSettings
51719
+ }, ws);
51720
+ }
51607
51721
  function needsOwnWorktreeCheck(msg) {
51608
51722
  if (msg.repos || msg.runInPlace === true) return false;
51609
51723
  const projectPath = (msg.path || "").trim();
@@ -51635,7 +51749,8 @@ function registerControlHandlers(controlWss, deps) {
51635
51749
  dangerouslySkipPermissions: skipPerms,
51636
51750
  unguarded: msg.unguarded === true,
51637
51751
  requireExistingPath: !repos,
51638
- environment: remote?.environment
51752
+ environment: remote?.environment,
51753
+ runSettings: msg.runSettings
51639
51754
  });
51640
51755
  if (!created.ok) {
51641
51756
  refuseAddSession(msg, ws, { error: created.error });
@@ -51643,7 +51758,8 @@ function registerControlHandlers(controlWss, deps) {
51643
51758
  }
51644
51759
  if (msg.requestId) replyTo(ws, msg, "add-session-result", {
51645
51760
  ok: true,
51646
- error: null
51761
+ error: null,
51762
+ sessionId: created.project.id
51647
51763
  });
51648
51764
  console.log(`[control] Added session via UI: ${name}${skipPerms ? " (skip permissions)" : " (permission prompts)"}${remote ? ` (Coder environment ${remote.environment.name})` : ""}`);
51649
51765
  return created.project;
@@ -51802,37 +51918,64 @@ function registerControlHandlers(controlWss, deps) {
51802
51918
  if (sess.state !== STATES.DORMANT) return;
51803
51919
  sess.start();
51804
51920
  }
51921
+ const lastRemovalRefusalBySessionId = /* @__PURE__ */ new Map();
51922
+ function refuseRemoval(error, keptPaths) {
51923
+ return keptPaths ? {
51924
+ ok: false,
51925
+ error,
51926
+ canDiscardWork: true,
51927
+ keptPaths
51928
+ } : {
51929
+ ok: false,
51930
+ error,
51931
+ canDiscardWork: true
51932
+ };
51933
+ }
51934
+ function keptWorkRefusal(sess, firstKept, otherKeptCount, keptPaths) {
51935
+ const more = otherKeptCount > 0 ? ` and ${otherKeptCount} more` : "";
51936
+ return refuseRemoval(`"${sess.name}" has work not saved in ${firstKept.path} (${firstKept.reason})${more}. Removing it deletes that work.`, keptPaths);
51937
+ }
51938
+ async function findLocalRemovalRefusal(sess, confirmedKeptPaths) {
51939
+ if (!sess.isWorkspace && await sess.hasUnmergedWork()) return refuseRemoval(`"${sess.name}" has uncommitted changes or commits not merged into its base branch. Removing it deletes them.`);
51940
+ const keptPaths = sess.isWorkspace ? await sess.findWorkspaceKeptWork() : [];
51941
+ const [firstUnconfirmedKept, ...otherUnconfirmedKept] = keptPaths.filter((kept) => !confirmedKeptPaths.has(kept.path));
51942
+ if (firstUnconfirmedKept) return keptWorkRefusal(sess, firstUnconfirmedKept, otherUnconfirmedKept.length, keptPaths);
51943
+ if (sess.state === STATES.RUNNING) return refuseRemoval(`"${sess.name}" is working. Removing it stops the agent mid-task.`);
51944
+ return null;
51945
+ }
51805
51946
  async function removeSession(msg) {
51806
51947
  const sess = findSession(msg);
51807
51948
  if (!sess) return {
51808
51949
  ok: false,
51809
51950
  error: "Session not found"
51810
51951
  };
51952
+ const isDiscardingWork = msg.discardWork === true;
51953
+ const isDiscardingWorkspaceWork = sess.isWorkspace && isDiscardingWork;
51954
+ if (isDiscardingWorkspaceWork) sess.killSession();
51955
+ const refusal = await findLocalRemovalRefusal(sess, new Set(isDiscardingWorkspaceWork ? msg.confirmedKeptPaths ?? [] : []));
51956
+ const isRefusalConfirmed = isDiscardingWork && refusal?.error === lastRemovalRefusalBySessionId.get(sess.id);
51957
+ if (refusal && !isRefusalConfirmed) {
51958
+ lastRemovalRefusalBySessionId.set(sess.id, refusal.error);
51959
+ return refusal;
51960
+ }
51811
51961
  if (agentSessions.get(sess.id) === sess) {
51962
+ if (isDiscardingWork) markChildWorktreeDiscard?.(sess.id);
51963
+ lastRemovalRefusalBySessionId.delete(sess.id);
51812
51964
  sess.destroy();
51813
51965
  console.log(`[control] Removed spawned session via UI: ${sess.name}`);
51814
51966
  return { ok: true };
51815
51967
  }
51816
- const isDiscardingWorkspaceWork = sess.isWorkspace && msg.discardWork === true;
51817
- if (isDiscardingWorkspaceWork) sess.killSession();
51818
- const keptPaths = sess.isWorkspace ? await sess.findWorkspaceKeptWork() : [];
51819
- const confirmedKeptPaths = new Set(isDiscardingWorkspaceWork ? msg.confirmedKeptPaths ?? [] : []);
51820
- if (keptPaths.some((kept) => !confirmedKeptPaths.has(kept.path))) return {
51821
- ok: false,
51822
- error: "Workspace members hold work that is not saved",
51823
- canDiscardWork: true,
51824
- keptPaths
51825
- };
51826
51968
  if (config.projects.some((project) => project.id === sess.id && project.environment) && coderEnv) {
51827
51969
  sess.killSession();
51828
51970
  const settlement = await coderEnv.settleRemoval({
51829
51971
  projectId: sess.id,
51830
- discardRemoteWork: msg.discardWork === true
51972
+ discardRemoteWork: isDiscardingWork
51831
51973
  });
51974
+ if (!settlement.ok && settlement.canDiscardRemoteWork) return refuseRemoval(`${settlement.reason}. Removing "${sess.name}" deletes its Coder workspace and that work with it.`);
51832
51975
  if (!settlement.ok) return {
51833
51976
  ok: false,
51834
51977
  error: settlement.reason,
51835
- canDiscardWork: settlement.canDiscardRemoteWork
51978
+ canDiscardWork: false
51836
51979
  };
51837
51980
  }
51838
51981
  const freshConfig = configStore.save((cfg) => {
@@ -51843,6 +51986,7 @@ function registerControlHandlers(controlWss, deps) {
51843
51986
  error: `Could not save the removal of session "${sess.name}"`
51844
51987
  };
51845
51988
  if (isDiscardingWorkspaceWork) sess.confirmWorkspaceWorkDiscard();
51989
+ lastRemovalRefusalBySessionId.delete(sess.id);
51846
51990
  applyConfigReload(freshConfig);
51847
51991
  console.log(`[control] Removed session via UI: ${sess.name}`);
51848
51992
  return { ok: true };
@@ -52353,7 +52497,7 @@ function registerControlHandlers(controlWss, deps) {
52353
52497
  }
52354
52498
  return entries;
52355
52499
  }
52356
- function createProjectSession({ id = generateProjectId(), name, path: projectPath, repos, baseBranch, agent, dangerouslySkipPermissions, unguarded, requireExistingPath, environment }) {
52500
+ function createProjectSession({ id = generateProjectId(), name, path: projectPath, repos, baseBranch, agent, dangerouslySkipPermissions, unguarded, requireExistingPath, environment, runSettings }) {
52357
52501
  for (const [, session] of sessions) {
52358
52502
  if (session.name !== name) continue;
52359
52503
  return {
@@ -52387,6 +52531,7 @@ function registerControlHandlers(controlWss, deps) {
52387
52531
  error: missingFolderError(projectPath)
52388
52532
  };
52389
52533
  const project = {
52534
+ ...runSettings,
52390
52535
  id,
52391
52536
  name,
52392
52537
  path: resolvedPath
@@ -53065,6 +53210,7 @@ function registerControlHandlers(controlWss, deps) {
53065
53210
  }
53066
53211
  const handlers = {
53067
53212
  "add-session": handleAddSession,
53213
+ "quick-session": handleQuickSession,
53068
53214
  "list-conversations": handleListConversations,
53069
53215
  "resume-conversation": handleResumeConversation,
53070
53216
  "remove-session": handleRemoveSession,
@@ -53577,15 +53723,37 @@ function registerControlHandlers(controlWss, deps) {
53577
53723
  });
53578
53724
  });
53579
53725
  });
53580
- return { buildSnapshot };
53726
+ function removeExitedSession(id) {
53727
+ removeSession({
53728
+ type: "remove-session",
53729
+ id
53730
+ }).then((removal) => {
53731
+ if (removal.ok) return;
53732
+ const sess = sessions.get(id);
53733
+ if (removal.canDiscardWork && sess) {
53734
+ broadcastControl({
53735
+ type: "session-close-confirm",
53736
+ id,
53737
+ mergeStatus: sess.mergeStatus
53738
+ });
53739
+ return;
53740
+ }
53741
+ console.warn(`[control] Could not remove session ${id} after its agent quit: ${removal.error}`);
53742
+ });
53743
+ }
53744
+ return {
53745
+ buildSnapshot,
53746
+ removeExitedSession
53747
+ };
53581
53748
  }
53582
53749
  //#endregion
53583
53750
  //#region server/backend/backend-control.ts
53584
53751
  function createBackendControl(dependencies) {
53585
53752
  const { controlWss, sessions, config, configStore, broadcastControl, controlReplayLog, laneAssembly, posthog, teamReview, myPrs, issues, benchmarks, usage, logger } = dependencies;
53586
- registerControlHandlers(controlWss, {
53753
+ const controlHandlers = registerControlHandlers(controlWss, {
53587
53754
  sessions,
53588
53755
  agentSessions: dependencies.agentSessions,
53756
+ markChildWorktreeDiscard: dependencies.markChildWorktreeDiscard,
53589
53757
  config,
53590
53758
  configStore,
53591
53759
  broadcastControl,
@@ -53655,6 +53823,7 @@ function createBackendControl(dependencies) {
53655
53823
  sendLaneSnapshotOnConnect("ingest", laneAssembly.currentIngest, true);
53656
53824
  sendLaneSnapshotOnConnect("session-docs", () => dependencies.sessionDocs, false);
53657
53825
  sendLaneSnapshotOnConnect("coherence-feed", () => dependencies.coherenceFeed, false);
53826
+ return { removeExitedSession: controlHandlers.removeExitedSession };
53658
53827
  }
53659
53828
  //#endregion
53660
53829
  //#region server/core/update-apply-core.ts
@@ -57439,6 +57608,7 @@ function createBackend(httpServer, options = {}) {
57439
57608
  const outcomes = createOutcomesLane();
57440
57609
  const recordOutcome = outcomes.record;
57441
57610
  let broadcastControl = null;
57611
+ let removeExitedSession = null;
57442
57612
  let agentApi = null;
57443
57613
  let gitWorkspace = null;
57444
57614
  const guardrailsRefusal = checkGuardrailsDependencies({ log: console });
@@ -57606,6 +57776,7 @@ function createBackend(httpServer, options = {}) {
57606
57776
  coherenceFeed,
57607
57777
  planReview: laneAssembly.planReview,
57608
57778
  closeSessionDataClients,
57779
+ removeExitedSession: (id) => removeExitedSession?.(id),
57609
57780
  telemetry,
57610
57781
  logger: console
57611
57782
  });
@@ -57794,10 +57965,11 @@ function createBackend(httpServer, options = {}) {
57794
57965
  spawn,
57795
57966
  beforeHandOff: updateApply.handOffStagedUpdate
57796
57967
  });
57797
- createBackendControl({
57968
+ ({removeExitedSession} = createBackendControl({
57798
57969
  controlWss,
57799
57970
  sessions,
57800
57971
  agentSessions,
57972
+ markChildWorktreeDiscard: (childId) => agentApi?.markChildWorktreeDiscard(childId),
57801
57973
  config,
57802
57974
  configStore,
57803
57975
  broadcastControl,
@@ -57840,7 +58012,7 @@ function createBackend(httpServer, options = {}) {
57840
58012
  serverBuild: () => serverBuild,
57841
58013
  telemetry,
57842
58014
  logger: console
57843
- });
58015
+ }));
57844
58016
  webSockets.attachDataConnection();
57845
58017
  const { handleUpgrade } = webSockets;
57846
58018
  httpServer.on("upgrade", handleUpgrade);