syntaur 0.67.0 → 0.69.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 (73) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/dashboard/dist/assets/{_basePickBy-CE2CIvur.js → _basePickBy-DKk6tHtk.js} +1 -1
  3. package/dashboard/dist/assets/{_baseUniq-BznLQqID.js → _baseUniq-DM-f7DWz.js} +1 -1
  4. package/dashboard/dist/assets/{arc-B6JqtWve.js → arc-ZBlA3YdV.js} +1 -1
  5. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-P8UCT3rj.js → architectureDiagram-2XIMDMQ5-BUmvtGTF.js} +1 -1
  6. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-C1ATZKSf.js → blockDiagram-WCTKOSBZ-B3qxWK6s.js} +1 -1
  7. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-AvN1yayQ.js → c4Diagram-IC4MRINW-BEq_UJO-.js} +1 -1
  8. package/dashboard/dist/assets/channel-fypxffzQ.js +1 -0
  9. package/dashboard/dist/assets/{chunk-4BX2VUAB-CyYz6mlJ.js → chunk-4BX2VUAB-C-Y9ryMm.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-55IACEB6-QyOF7ox_.js → chunk-55IACEB6-CGdtbsjw.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-FMBD7UC4-DVTHM99U.js → chunk-FMBD7UC4-DllxJhUp.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-JSJVCQXG-DQfxaQtT.js → chunk-JSJVCQXG-jjMM8O5F.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-KX2RTZJC-4R1oobH6.js → chunk-KX2RTZJC-B_6BPltQ.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-NQ4KR5QH-D8H_7yNS.js → chunk-NQ4KR5QH-D0hJiXHp.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-QZHKN3VN-DLxDUSuo.js → chunk-QZHKN3VN-BCWo4hLS.js} +1 -1
  16. package/dashboard/dist/assets/{chunk-WL4C6EOR-CWuFDkVp.js → chunk-WL4C6EOR-DH_jEAwg.js} +1 -1
  17. package/dashboard/dist/assets/classDiagram-VBA2DB6C-1KnjQvtL.js +1 -0
  18. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-1KnjQvtL.js +1 -0
  19. package/dashboard/dist/assets/clone-CKMabBhS.js +1 -0
  20. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-D23Dy_Za.js → cose-bilkent-S5V4N54A-5ld00TOH.js} +1 -1
  21. package/dashboard/dist/assets/{dagre-KLK3FWXG-CaKBk8eh.js → dagre-KLK3FWXG-Cnu6eQWy.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-E7M64L7V-BAPQPki-.js → diagram-E7M64L7V-_CBBKNP-.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-IFDJBPK2-Cla6qyvn.js → diagram-IFDJBPK2-DE6WjIb1.js} +1 -1
  24. package/dashboard/dist/assets/{diagram-P4PSJMXO-DnTZq_y6.js → diagram-P4PSJMXO-DpW7UzNK.js} +1 -1
  25. package/dashboard/dist/assets/{erDiagram-INFDFZHY-yc1_7ebn.js → erDiagram-INFDFZHY-BD2409fE.js} +1 -1
  26. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-CMt2tF6O.js → flowDiagram-PKNHOUZH-1p0khhFI.js} +1 -1
  27. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-CXiK-5Gp.js → ganttDiagram-A5KZAMGK-B2zFyA4s.js} +1 -1
  28. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-B4PbW06T.js → gitGraphDiagram-K3NZZRJ6-bH-4YH7h.js} +1 -1
  29. package/dashboard/dist/assets/{graph-CjdFy-q-.js → graph-BT24B6iQ.js} +1 -1
  30. package/dashboard/dist/assets/{index-DlUgV5eO.css → index-BZwPAi8K.css} +1 -1
  31. package/dashboard/dist/assets/index-Cxqr3rQB.js +670 -0
  32. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-BeOWVt7p.js → infoDiagram-LFFYTUFH-CMzP4Hcg.js} +1 -1
  33. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-LE7swZOH.js → ishikawaDiagram-PHBUUO56-DMEmFC7M.js} +1 -1
  34. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-DG9-sksf.js → journeyDiagram-4ABVD52K-CAtzYQUm.js} +1 -1
  35. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-7CKAw6eI.js → kanban-definition-K7BYSVSG-d1JVbtvX.js} +1 -1
  36. package/dashboard/dist/assets/{layout-CHChKPuz.js → layout-BVuI38I_.js} +1 -1
  37. package/dashboard/dist/assets/{linear-BWSj4au4.js → linear-Bc8PGMbp.js} +1 -1
  38. package/dashboard/dist/assets/{mermaid.core-CAwQaPqG.js → mermaid.core-UtwFYLNj.js} +4 -4
  39. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-CtZWMkVN.js → mindmap-definition-YRQLILUH-DHc5RCDj.js} +1 -1
  40. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-CstCoaK7.js → pieDiagram-SKSYHLDU-9anIsdIA.js} +1 -1
  41. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-DD8zRtaB.js → quadrantDiagram-337W2JSQ-FZ0D9HnU.js} +1 -1
  42. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-BWpKIK3b.js → requirementDiagram-Z7DCOOCP-BkjCvH_u.js} +1 -1
  43. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-08gqQtFM.js → sankeyDiagram-WA2Y5GQK-DzqwYHDo.js} +1 -1
  44. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-DsfIDBUH.js → sequenceDiagram-2WXFIKYE-BW4g5Ao-.js} +1 -1
  45. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-Dqzfk_yy.js → stateDiagram-RAJIS63D-D0tKU3Z0.js} +1 -1
  46. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-DxWQhjNO.js +1 -0
  47. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-DgH_p9jR.js → timeline-definition-YZTLITO2-Bu269QDX.js} +1 -1
  48. package/dashboard/dist/assets/{treemap-KZPCXAKY-7XKqMhq9.js → treemap-KZPCXAKY-BGu_rrva.js} +1 -1
  49. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-BFtNLBWM.js → vennDiagram-LZ73GAT5-Cx_n5FRZ.js} +1 -1
  50. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-CQPevMNl.js → xychartDiagram-JWTSCODW-BOJsKV_W.js} +1 -1
  51. package/dashboard/dist/index.html +2 -2
  52. package/dist/dashboard/server.js +459 -63
  53. package/dist/dashboard/server.js.map +1 -1
  54. package/dist/index.js +1158 -702
  55. package/dist/index.js.map +1 -1
  56. package/dist/launch/index.d.ts +18 -0
  57. package/dist/launch/index.js +120 -12
  58. package/dist/launch/index.js.map +1 -1
  59. package/package.json +1 -1
  60. package/platforms/claude-code/.claude-plugin/plugin.json +1 -1
  61. package/platforms/claude-code/hooks/hooks.json +1 -1
  62. package/platforms/claude-code/hooks/session-cleanup.sh +21 -0
  63. package/platforms/codex/.codex-plugin/plugin.json +1 -1
  64. package/platforms/codex/hooks.json +1 -1
  65. package/platforms/codex/scripts/session-cleanup.sh +13 -0
  66. package/platforms/hermes/plugins/syntaur/__pycache__/__init__.cpython-312.pyc +0 -0
  67. package/platforms/hermes/plugins/syntaur/__pycache__/boundary.cpython-312.pyc +0 -0
  68. package/dashboard/dist/assets/channel-IZujZyS6.js +0 -1
  69. package/dashboard/dist/assets/classDiagram-VBA2DB6C-ChnJofe3.js +0 -1
  70. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-ChnJofe3.js +0 -1
  71. package/dashboard/dist/assets/clone-JjIbzsqJ.js +0 -1
  72. package/dashboard/dist/assets/index-COOcebN7.js +0 -659
  73. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-D542UPiR.js +0 -1
@@ -180,6 +180,19 @@ interface DeriveConfig {
180
180
  headline: HeadlineProjection;
181
181
  }
182
182
 
183
+ /**
184
+ * Per-reason age gates (ms). Defaults are sensible; Task 5 lets config override
185
+ * these keyed on disposition/phase. `deps_unsatisfied` has no age gate (a hard
186
+ * contradiction), so it is intentionally absent here.
187
+ */
188
+ interface StaleThresholds {
189
+ inProgressNoActivityMs: number;
190
+ readyUnclaimedMs: number;
191
+ reviewAgingMs: number;
192
+ blockedAgingMs: number;
193
+ planApprovalAgingMs: number;
194
+ }
195
+
183
196
  /**
184
197
  * Search-config schema — the shape behind the `search:` block in
185
198
  * `~/.syntaur/config.md` and the command palette's customizable behavior.
@@ -307,6 +320,11 @@ interface SyntaurConfig {
307
320
  terminal: TerminalChoice | null;
308
321
  searchConfig: SearchConfig | null;
309
322
  workspaceVisibility: WorkspaceVisibilityConfig;
323
+ /** Optional per-reason staleness age-gate overrides (defaults-first; null = all defaults). */
324
+ staleness: Partial<StaleThresholds> | null;
325
+ /** Opt-in: run the read-only staleness watchdog on the dashboard loop (emits
326
+ * staleness-detected/cleared audit events; never mutates status). Off by default. */
327
+ stalenessWatchdog: boolean;
310
328
  }
311
329
 
312
330
  /**
@@ -2153,7 +2153,9 @@ __export(config_exports, {
2153
2153
  getTerminal: () => getTerminal,
2154
2154
  normalizeFactDeclarations: () => normalizeFactDeclarations,
2155
2155
  parseAgentCommand: () => parseAgentCommand,
2156
+ parseDurationMs: () => parseDurationMs,
2156
2157
  parseSearchConfig: () => parseSearchConfig,
2158
+ parseStalenessConfig: () => parseStalenessConfig,
2157
2159
  parseStatusConfig: () => parseStatusConfig,
2158
2160
  parseTerminalConfig: () => parseTerminalConfig,
2159
2161
  readConfig: () => readConfig,
@@ -2169,6 +2171,7 @@ __export(config_exports, {
2169
2171
  validateDeriveConfig: () => validateDeriveConfig,
2170
2172
  validateDeriveShape: () => validateDeriveShape,
2171
2173
  validateFactDeclarations: () => validateFactDeclarations,
2174
+ validateStalenessConfig: () => validateStalenessConfig,
2172
2175
  writeAgentsConfig: () => writeAgentsConfig,
2173
2176
  writeHotkeyBindingsConfig: () => writeHotkeyBindingsConfig,
2174
2177
  writeSearchConfig: () => writeSearchConfig,
@@ -2180,6 +2183,13 @@ __export(config_exports, {
2180
2183
  import { readFile as readFile5 } from "fs/promises";
2181
2184
  import { spawnSync } from "child_process";
2182
2185
  import { resolve as resolve7, isAbsolute } from "path";
2186
+ function parseDurationMs(raw) {
2187
+ const m = raw.trim().match(DURATION_RE);
2188
+ if (!m) return null;
2189
+ const n = Number(m[1]);
2190
+ if (!Number.isFinite(n) || n <= 0) return null;
2191
+ return n * DURATION_UNIT_MS[m[2] ?? "ms"];
2192
+ }
2183
2193
  function parseAgentCommand(value, agentId) {
2184
2194
  if (typeof value !== "string" || value.trim() === "") {
2185
2195
  throw new AgentConfigError(
@@ -3416,6 +3426,65 @@ ${cleanedFm}
3416
3426
  ---${afterFrontmatter}`;
3417
3427
  await writeFileForce(configPath, newContent);
3418
3428
  }
3429
+ function parseStalenessConfig(content) {
3430
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
3431
+ if (!match) return null;
3432
+ const fmBlock = match[1];
3433
+ const blockStart = fmBlock.match(/^staleness:\s*$/m);
3434
+ if (!blockStart) return null;
3435
+ const startIdx = (blockStart.index ?? 0) + blockStart[0].length;
3436
+ const lines = fmBlock.slice(startIdx).split("\n");
3437
+ const out = {};
3438
+ for (const line of lines) {
3439
+ if (line.trim() === "") continue;
3440
+ const trimmed = line.trimStart();
3441
+ const indent = line.length - trimmed.length;
3442
+ if (indent === 0) break;
3443
+ const ci = trimmed.indexOf(":");
3444
+ if (ci <= 0) continue;
3445
+ const key = trimmed.slice(0, ci).trim();
3446
+ const field = STALENESS_KEY_TO_FIELD[key];
3447
+ if (!field) continue;
3448
+ let value = trimmed.slice(ci + 1).trim();
3449
+ if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
3450
+ value = value.slice(1, -1);
3451
+ }
3452
+ const ms = parseDurationMs(value);
3453
+ if (ms !== null) out[field] = ms;
3454
+ }
3455
+ return Object.keys(out).length > 0 ? out : null;
3456
+ }
3457
+ function validateStalenessConfig(content) {
3458
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
3459
+ if (!match) return [];
3460
+ const fmBlock = match[1];
3461
+ const blockStart = fmBlock.match(/^staleness:\s*$/m);
3462
+ if (!blockStart) return [];
3463
+ const startIdx = (blockStart.index ?? 0) + blockStart[0].length;
3464
+ const lines = fmBlock.slice(startIdx).split("\n");
3465
+ const problems = [];
3466
+ for (const line of lines) {
3467
+ if (line.trim() === "") continue;
3468
+ const trimmed = line.trimStart();
3469
+ const indent = line.length - trimmed.length;
3470
+ if (indent === 0) break;
3471
+ const ci = trimmed.indexOf(":");
3472
+ if (ci <= 0) continue;
3473
+ const key = trimmed.slice(0, ci).trim();
3474
+ let value = trimmed.slice(ci + 1).trim();
3475
+ if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
3476
+ value = value.slice(1, -1);
3477
+ }
3478
+ if (!(key in STALENESS_KEY_TO_FIELD)) {
3479
+ problems.push(`staleness.${key}: unknown key (expected one of ${Object.keys(STALENESS_KEY_TO_FIELD).join(", ")})`);
3480
+ continue;
3481
+ }
3482
+ if (parseDurationMs(value) === null) {
3483
+ problems.push(`staleness.${key}: "${value}" is not a positive duration (e.g. 7d, 12h, 30m, 90s, 500ms)`);
3484
+ }
3485
+ }
3486
+ return problems;
3487
+ }
3419
3488
  function parseSearchConfig(content) {
3420
3489
  const match = content.match(/^---\n([\s\S]*?)\n---/);
3421
3490
  if (!match) return null;
@@ -3698,7 +3767,9 @@ async function readConfig() {
3698
3767
  }
3699
3768
  })(),
3700
3769
  searchConfig: parseSearchConfig(content),
3701
- workspaceVisibility: parseWorkspaceVisibilityConfig(fmBlock)
3770
+ workspaceVisibility: parseWorkspaceVisibilityConfig(fmBlock),
3771
+ staleness: parseStalenessConfig(content),
3772
+ stalenessWatchdog: String(fm["stalenessWatchdog"]).toLowerCase() === "true"
3702
3773
  };
3703
3774
  }
3704
3775
  function getAssignmentTypes(config) {
@@ -3761,7 +3832,7 @@ async function updateAgentsConfig(mutation, options = {}) {
3761
3832
  await writeAgentsConfig(next);
3762
3833
  return { previous, next, written: true };
3763
3834
  }
3764
- var DEFAULT_ASSIGNMENT_TYPES, DEFAULT_CONFIG, AUTO_CREATE_WORKTREE_VALUES, SESSION_AUTO_TRACK_VALUES, AgentConfigError, DEFAULT_STATUS_COLORS, KNOWN_AGENT_SCALAR_FIELDS, migratedConfigPaths, TerminalConfigError;
3835
+ var STALENESS_KEY_TO_FIELD, DURATION_RE, DURATION_UNIT_MS, DEFAULT_ASSIGNMENT_TYPES, DEFAULT_CONFIG, AUTO_CREATE_WORKTREE_VALUES, SESSION_AUTO_TRACK_VALUES, AgentConfigError, DEFAULT_STATUS_COLORS, KNOWN_AGENT_SCALAR_FIELDS, migratedConfigPaths, TerminalConfigError;
3765
3836
  var init_config2 = __esm({
3766
3837
  "src/utils/config.ts"() {
3767
3838
  "use strict";
@@ -3778,6 +3849,21 @@ var init_config2 = __esm({
3778
3849
  init_terminal_schema();
3779
3850
  init_search_schema();
3780
3851
  init_workspace_visibility_schema();
3852
+ STALENESS_KEY_TO_FIELD = {
3853
+ inProgressNoActivity: "inProgressNoActivityMs",
3854
+ readyUnclaimed: "readyUnclaimedMs",
3855
+ reviewAging: "reviewAgingMs",
3856
+ blockedAging: "blockedAgingMs",
3857
+ planApprovalAging: "planApprovalAgingMs"
3858
+ };
3859
+ DURATION_RE = /^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)?$/;
3860
+ DURATION_UNIT_MS = {
3861
+ ms: 1,
3862
+ s: 1e3,
3863
+ m: 6e4,
3864
+ h: 36e5,
3865
+ d: 864e5
3866
+ };
3781
3867
  DEFAULT_ASSIGNMENT_TYPES = {
3782
3868
  definitions: [
3783
3869
  { id: "feature", label: "Feature" },
@@ -3820,7 +3906,9 @@ var init_config2 = __esm({
3820
3906
  searchConfig: null,
3821
3907
  workspaceVisibility: {
3822
3908
  hidden: []
3823
- }
3909
+ },
3910
+ staleness: null,
3911
+ stalenessWatchdog: false
3824
3912
  };
3825
3913
  AUTO_CREATE_WORKTREE_VALUES = ["skip", "ask", "always"];
3826
3914
  SESSION_AUTO_TRACK_VALUES = ["all", "workspaces-only", "off"];
@@ -5075,8 +5163,24 @@ var init_overviewCopy = __esm({
5075
5163
  }
5076
5164
  });
5077
5165
 
5166
+ // src/staleness/classify.ts
5167
+ var DAY, DEFAULT_STALE_THRESHOLDS;
5168
+ var init_classify = __esm({
5169
+ "src/staleness/classify.ts"() {
5170
+ "use strict";
5171
+ DAY = 24 * 60 * 60 * 1e3;
5172
+ DEFAULT_STALE_THRESHOLDS = {
5173
+ inProgressNoActivityMs: 7 * DAY,
5174
+ readyUnclaimedMs: 3 * DAY,
5175
+ reviewAgingMs: 3 * DAY,
5176
+ blockedAgingMs: 3 * DAY,
5177
+ planApprovalAgingMs: 3 * DAY
5178
+ };
5179
+ }
5180
+ });
5181
+
5078
5182
  // src/dashboard/api.ts
5079
- import { readdir as readdir9, readFile as readFile12, writeFile as writeFile3 } from "fs/promises";
5183
+ import { readdir as readdir9, readFile as readFile12, writeFile as writeFile3, stat as stat2 } from "fs/promises";
5080
5184
  import { resolve as resolve15, dirname as dirname2, basename } from "path";
5081
5185
  function activeAssignments(items) {
5082
5186
  return items.filter((item) => item.archived !== true);
@@ -5951,7 +6055,7 @@ function getProjectActivityTimestamp(projectUpdated, assignments) {
5951
6055
  }
5952
6056
  return latest;
5953
6057
  }
5954
- var STALE_ASSIGNMENT_MS, projectRecordsCache, standaloneRecordsCache, DEFAULT_TRANSITION_DEFINITIONS, _cachedConfig, REFERENCED_BY_LIMIT, migratedProjectsDirs, DEFAULT_GRAPH_COLORS;
6058
+ var projectRecordsCache, standaloneRecordsCache, DEFAULT_TRANSITION_DEFINITIONS, _cachedConfig, REFERENCED_BY_LIMIT, migratedProjectsDirs, DEFAULT_GRAPH_COLORS;
5955
6059
  var init_api = __esm({
5956
6060
  "src/dashboard/api.ts"() {
5957
6061
  "use strict";
@@ -5969,7 +6073,7 @@ var init_api = __esm({
5969
6073
  init_help();
5970
6074
  init_agent_sessions();
5971
6075
  init_overviewCopy();
5972
- STALE_ASSIGNMENT_MS = 7 * 24 * 60 * 60 * 1e3;
6076
+ init_classify();
5973
6077
  projectRecordsCache = /* @__PURE__ */ new Map();
5974
6078
  standaloneRecordsCache = /* @__PURE__ */ new Map();
5975
6079
  DEFAULT_TRANSITION_DEFINITIONS = [
@@ -6461,25 +6565,29 @@ async function resolveSessionPlan(input, terminal) {
6461
6565
  }
6462
6566
  let cwd = session.path;
6463
6567
  let fallbackWarning = null;
6464
- if (session.projectSlug && session.assignmentSlug) {
6465
- const detail = await getAssignmentDetail(
6568
+ if (!isExistingDir(session.path)) {
6569
+ const detail = session.projectSlug && session.assignmentSlug ? await getAssignmentDetail(
6466
6570
  input.projectsDir,
6467
6571
  session.projectSlug,
6468
6572
  session.assignmentSlug
6469
- );
6573
+ ) : session.assignmentSlug ? await getAssignmentDetailById(
6574
+ input.projectsDir,
6575
+ input.assignmentsDir,
6576
+ session.assignmentSlug
6577
+ ) : null;
6470
6578
  if (detail) {
6471
6579
  const picked = resolveWorkspaceCwd({
6472
6580
  worktreePath: detail.workspace.worktreePath,
6473
6581
  repository: detail.workspace.repository,
6474
6582
  branch: detail.workspace.branch,
6475
- assignmentSlug: session.assignmentSlug
6583
+ assignmentSlug: detail.slug
6476
6584
  });
6477
6585
  if (picked.cwd !== null) {
6478
6586
  cwd = picked.cwd;
6479
6587
  fallbackWarning = picked.fallbackWarning;
6480
6588
  } else {
6481
6589
  fallbackWarning = formatFallbackCwdWarning({
6482
- assignmentSlug: session.assignmentSlug,
6590
+ assignmentSlug: detail.slug,
6483
6591
  workspaceDir: session.path,
6484
6592
  worktreePath: detail.workspace.worktreePath,
6485
6593
  branch: detail.workspace.branch
@@ -6615,7 +6723,7 @@ function captureProcessStartedAt(pid) {
6615
6723
 
6616
6724
  // src/usage/cwd-extractor.ts
6617
6725
  init_paths();
6618
- import { open as open2, readdir as readdir10, stat as stat2 } from "fs/promises";
6726
+ import { open as open2, readdir as readdir10, stat as stat3 } from "fs/promises";
6619
6727
  import { join as join4 } from "path";
6620
6728
  import { homedir as homedir3 } from "os";
6621
6729