crewly 1.20.157 → 1.20.159

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 (154) hide show
  1. package/README.md +1 -0
  2. package/config/skills/registry.json +55 -4
  3. package/config/templates/growth-marketing-team.json +5 -5
  4. package/config/templates/personal-assistant-team.json +5 -5
  5. package/dist/backend/backend/src/constants.d.ts +120 -5
  6. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  7. package/dist/backend/backend/src/constants.js +145 -8
  8. package/dist/backend/backend/src/constants.js.map +1 -1
  9. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.d.ts +2 -1
  10. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.d.ts.map +1 -1
  11. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.js +4 -2
  12. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.js.map +1 -1
  13. package/dist/backend/backend/src/index.d.ts.map +1 -1
  14. package/dist/backend/backend/src/index.js +17 -2
  15. package/dist/backend/backend/src/index.js.map +1 -1
  16. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +9 -0
  17. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  18. package/dist/backend/backend/src/services/agent/agent-registration.service.js +34 -29
  19. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  20. package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts +4 -3
  21. package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
  22. package/dist/backend/backend/src/services/agent/codex-runtime.service.js +48 -3
  23. package/dist/backend/backend/src/services/agent/codex-runtime.service.js.map +1 -1
  24. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts +9 -0
  25. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts.map +1 -1
  26. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.js +18 -1
  27. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.js.map +1 -1
  28. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  29. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +5 -1
  30. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  31. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  32. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +14 -4
  33. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  34. package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts +14 -2
  35. package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts.map +1 -1
  36. package/dist/backend/backend/src/services/agent/tmux-command.service.js +24 -5
  37. package/dist/backend/backend/src/services/agent/tmux-command.service.js.map +1 -1
  38. package/dist/backend/backend/src/services/agent/tmux.service.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/agent/tmux.service.js +14 -9
  40. package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
  41. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts +8 -0
  42. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/backup/backup-archive.service.js +16 -8
  44. package/dist/backend/backend/src/services/backup/backup-archive.service.js.map +1 -1
  45. package/dist/backend/backend/src/services/backup/backup.types.d.ts +19 -0
  46. package/dist/backend/backend/src/services/backup/backup.types.d.ts.map +1 -1
  47. package/dist/backend/backend/src/services/backup/backup.types.js +19 -0
  48. package/dist/backend/backend/src/services/backup/backup.types.js.map +1 -1
  49. package/dist/backend/backend/src/services/security/secret-scrub.service.d.ts +108 -0
  50. package/dist/backend/backend/src/services/security/secret-scrub.service.d.ts.map +1 -0
  51. package/dist/backend/backend/src/services/security/secret-scrub.service.js +200 -0
  52. package/dist/backend/backend/src/services/security/secret-scrub.service.js.map +1 -0
  53. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts +13 -9
  54. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +30 -14
  56. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  57. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  58. package/dist/backend/backend/src/services/session/pty/pty-session.js +6 -1
  59. package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
  60. package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/session/session-command-helper.js +3 -2
  62. package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
  63. package/dist/backend/backend/src/services/worktree/low-disk-guard.d.ts +109 -0
  64. package/dist/backend/backend/src/services/worktree/low-disk-guard.d.ts.map +1 -0
  65. package/dist/backend/backend/src/services/worktree/low-disk-guard.js +148 -0
  66. package/dist/backend/backend/src/services/worktree/low-disk-guard.js.map +1 -0
  67. package/dist/backend/backend/src/services/worktree/scratch-janitor.d.ts +140 -0
  68. package/dist/backend/backend/src/services/worktree/scratch-janitor.d.ts.map +1 -0
  69. package/dist/backend/backend/src/services/worktree/scratch-janitor.js +249 -0
  70. package/dist/backend/backend/src/services/worktree/scratch-janitor.js.map +1 -0
  71. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.d.ts +92 -1
  72. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.js +207 -1
  74. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.js.map +1 -1
  75. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +135 -28
  76. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +248 -39
  78. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
  79. package/dist/backend/backend/src/types/team-template.types.d.ts +1 -1
  80. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  81. package/dist/backend/backend/src/utils/secret-redactor.d.ts +131 -0
  82. package/dist/backend/backend/src/utils/secret-redactor.d.ts.map +1 -0
  83. package/dist/backend/backend/src/utils/secret-redactor.js +233 -0
  84. package/dist/backend/backend/src/utils/secret-redactor.js.map +1 -0
  85. package/dist/backend/backend/src/utils/shell-history.d.ts +48 -0
  86. package/dist/backend/backend/src/utils/shell-history.d.ts.map +1 -0
  87. package/dist/backend/backend/src/utils/shell-history.js +65 -0
  88. package/dist/backend/backend/src/utils/shell-history.js.map +1 -0
  89. package/dist/backend/build-info.json +2 -2
  90. package/dist/cli/backend/src/constants.d.ts +120 -5
  91. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  92. package/dist/cli/backend/src/constants.js +145 -8
  93. package/dist/cli/backend/src/constants.js.map +1 -1
  94. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +9 -0
  95. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  96. package/dist/cli/backend/src/services/agent/agent-registration.service.js +34 -29
  97. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  98. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts +4 -3
  99. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
  100. package/dist/cli/backend/src/services/agent/codex-runtime.service.js +48 -3
  101. package/dist/cli/backend/src/services/agent/codex-runtime.service.js.map +1 -1
  102. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts +9 -0
  103. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts.map +1 -1
  104. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.js +18 -1
  105. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.js.map +1 -1
  106. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  107. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +5 -1
  108. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  109. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  110. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +14 -4
  111. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  112. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +8 -0
  113. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
  114. package/dist/cli/backend/src/services/backup/backup-archive.service.js +16 -8
  115. package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -1
  116. package/dist/cli/backend/src/services/backup/backup.types.d.ts +19 -0
  117. package/dist/cli/backend/src/services/backup/backup.types.d.ts.map +1 -1
  118. package/dist/cli/backend/src/services/backup/backup.types.js +19 -0
  119. package/dist/cli/backend/src/services/backup/backup.types.js.map +1 -1
  120. package/dist/cli/backend/src/services/security/secret-scrub.service.d.ts +108 -0
  121. package/dist/cli/backend/src/services/security/secret-scrub.service.d.ts.map +1 -0
  122. package/dist/cli/backend/src/services/security/secret-scrub.service.js +200 -0
  123. package/dist/cli/backend/src/services/security/secret-scrub.service.js.map +1 -0
  124. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts +13 -9
  125. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
  126. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js +30 -14
  127. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  128. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  129. package/dist/cli/backend/src/services/session/pty/pty-session.js +6 -1
  130. package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
  131. package/dist/cli/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  132. package/dist/cli/backend/src/services/session/session-command-helper.js +3 -2
  133. package/dist/cli/backend/src/services/session/session-command-helper.js.map +1 -1
  134. package/dist/cli/backend/src/types/team-template.types.d.ts +1 -1
  135. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  136. package/dist/cli/backend/src/utils/secret-redactor.d.ts +131 -0
  137. package/dist/cli/backend/src/utils/secret-redactor.d.ts.map +1 -0
  138. package/dist/cli/backend/src/utils/secret-redactor.js +233 -0
  139. package/dist/cli/backend/src/utils/secret-redactor.js.map +1 -0
  140. package/dist/cli/backend/src/utils/shell-history.d.ts +48 -0
  141. package/dist/cli/backend/src/utils/shell-history.d.ts.map +1 -0
  142. package/dist/cli/backend/src/utils/shell-history.js +65 -0
  143. package/dist/cli/backend/src/utils/shell-history.js.map +1 -0
  144. package/dist/cli/cli/src/commands/security.d.ts +41 -0
  145. package/dist/cli/cli/src/commands/security.d.ts.map +1 -0
  146. package/dist/cli/cli/src/commands/security.js +81 -0
  147. package/dist/cli/cli/src/commands/security.js.map +1 -0
  148. package/dist/cli/cli/src/index.js +9 -0
  149. package/dist/cli/cli/src/index.js.map +1 -1
  150. package/frontend/dist/assets/index-edd6f262.css +42 -0
  151. package/frontend/dist/assets/{index-8d4b3ad2.js → index-f79676aa.js} +268 -268
  152. package/frontend/dist/index.html +2 -2
  153. package/package.json +1 -1
  154. package/frontend/dist/assets/index-b6aded4c.css +0 -42
@@ -1,43 +1,47 @@
1
1
  /**
2
- * Worktree janitor — removes git worktrees whose work has landed.
2
+ * Disk janitor — removes git worktrees whose work has landed, stale Claude
3
+ * Code session scratch dirs, and watches free disk space.
3
4
  *
4
- * Agents create a worktree per code task (`<repo>/.claude/worktrees/<name>`,
5
- * `/tmp/crewly-worktrees/<session>-<slug>`) and never delete it; a busy Mac
6
- * collected 30+ of them, tens of GB. Owner decision: once the PR is merged the
7
- * worktree goes away by itself.
5
+ * Agents create a worktree per code task and never delete it — under
6
+ * `<repo>/.claude/worktrees/`, `/tmp/crewly-worktrees/`, but also at
7
+ * arbitrary paths (`/private/tmp/claude-501/visa-cm-wt`, `../crewly-wt-805`),
8
+ * each with its own node_modules. They also clone whole repos into Claude
9
+ * Code's per-session temp dirs. A Mac filled its disk (ENOSPC) with both.
10
+ * Owner decision: finished work goes away by itself.
8
11
  *
9
12
  * ## Which repos
10
13
  * Every registered project path (projects store) that is inside a git repo,
11
- * plus the Crewly package root when it is a dev checkout. Repos are
12
- * de-duplicated by their main worktree.
14
+ * the Crewly package root when it is a dev checkout, and every repo that owns
15
+ * a linked worktree found under the temp roots (`/tmp`, os.tmpdir(), and the
16
+ * Claude scratch roots `<tmp>/claude-<uid>`, searched a few levels deep) — so
17
+ * a repo that is not a registered project still gets its temp worktrees
18
+ * cleaned. Repos are de-duplicated by their main worktree.
13
19
  *
14
- * ## Removal rules — a worktree is removed only when ALL hold
20
+ * ## Worktree removal rules — a worktree is removed only when ALL hold
15
21
  * 1. It is not the main worktree, not bare, and not `prunable` (a missing
16
- * directory is left to `git worktree prune`).
22
+ * directory is left to `git worktree prune`). Any other linked worktree of
23
+ * a known repo is a candidate, wherever it lives and whatever its branch.
17
24
  * 2. It is not locked (`git worktree lock`; Claude Code locks the worktree of
18
25
  * a running subagent).
19
26
  * 3. It is not under `<repo>/.crewly/worktrees/` — that directory belongs to
20
27
  * the per-WorkItem worktree feature (#814), which does its own
21
28
  * WorkItem-aware cleanup.
22
- * 4. It is an agent worktree: its path is under `<main>/.claude/worktrees/`
23
- * or `<tmp>/crewly-worktrees/` (`/tmp` and `os.tmpdir()`), OR its branch
24
- * starts with an agent-only prefix (`worktree-agent-`, Claude Code's
25
- * automatic subagent branch). Human-made worktrees such as
26
- * `../crewly-wt-805` on `fix/...` are never touched. Deliberately narrow:
27
- * a false "keep" costs disk, a false "remove" costs work.
28
- * 5. Nothing is working in it: no Crewly agent session was started in it and
29
+ * 4. Nothing is working in it: no Crewly agent session was started in it and
29
30
  * no process of this user (PTY shells, runtimes, editors, test runners)
30
31
  * has its cwd inside it. If the process probe fails, everything is kept.
31
- * 6. It was last touched more than 2 hours ago (newest mtime of the
32
- * directory and its git dir's index / HEAD / logs/HEAD).
33
- * 7. `git status --porcelain --untracked-files=all` is empty: no tracked
32
+ * 5. It is idle: last touched (newest mtime of the directory and its git
33
+ * dir's index / HEAD / logs/HEAD) more than 2 hours ago in a known agent
34
+ * location (`<main>/.claude/worktrees/`, `<tmp>/crewly-worktrees/`, or a
35
+ * `worktree-agent-*` branch), more than 24 hours ago anywhere else.
36
+ * 6. `git status --porcelain --untracked-files=all` is empty: no tracked
34
37
  * change and no untracked file. Ignored files (node_modules, dist) do not
35
38
  * count. A failing status keeps it.
36
- * 8. Its work has landed: HEAD is an ancestor of `origin/<default branch>`
39
+ * 7. Its work has landed: HEAD is an ancestor of `origin/<default branch>`
37
40
  * after a quiet `git fetch` (fetch errors ignored), OR — when `gh` is
38
41
  * installed and authenticated — a MERGED PR has this branch as head AND
39
42
  * its head commit equals the worktree HEAD (squash merges; commits made
40
- * after the merge keep the worktree).
43
+ * after the merge keep the worktree). A repo without an origin (not on
44
+ * GitHub) only has the ancestor check, so its worktrees are kept.
41
45
  *
42
46
  * ## Removal
43
47
  * `git worktree remove <path>` without `--force`. If git refuses although
@@ -45,13 +49,34 @@
45
49
  * no submodules, it is retried once with `--force`. Then the local branch is
46
50
  * deleted (never a protected name), and `git worktree prune` runs per repo.
47
51
  *
52
+ * ## Scratch sweep
53
+ * After the worktrees, stale Claude Code session dirs
54
+ * (`<tmp>/claude-<uid>/<slug>/<uuid>/`) are deleted when idle for 3 days,
55
+ * unused, and every git repo inside is clean and fully pushed. See
56
+ * {@link module:services/worktree/scratch-janitor} for the rules.
57
+ *
58
+ * ## Low-disk guard
59
+ * Every 10 minutes the free space of the volume holding CREWLY_HOME is read.
60
+ * Below 15 GB a pass runs at once (at most one per 30 minutes) with every
61
+ * idle threshold halved (never below 2 h); every pass started while space is
62
+ * low uses the halved thresholds. If space is still below 15 GB the owner is
63
+ * told, at most once per 24 h, with the free space and the 5 biggest items
64
+ * the janitor left and why; below 5 GB the notice is urgent and repeats at
65
+ * most every 6 h.
66
+ *
48
67
  * Runs every 30 minutes (first run 10 minutes after boot). Kill switch:
49
- * `CREWLY_WORKTREE_JANITOR=0`. Never throws; logs one summary line per run.
68
+ * `CREWLY_WORKTREE_JANITOR=0` (also stops the low-disk guard). Never throws;
69
+ * logs one summary line per sweep.
50
70
  *
51
71
  * @module services/worktree/worktree-janitor.service
52
72
  */
53
- /** Why a worktree is kept, or why it may go. */
54
- export type WorktreeReason = 'main-worktree' | 'bare' | 'prunable' | 'locked' | 'managed-by-workitem-worktrees' | 'not-agent-worktree' | 'agent-session-inside' | 'process-inside' | 'cwd-probe-failed' | 'recent' | 'dirty' | 'status-failed' | 'not-merged' | 'merged' | 'pr-merged';
73
+ import { type StatFsFn } from './low-disk-guard.js';
74
+ import { type ScratchSweepSummary } from './scratch-janitor.js';
75
+ /**
76
+ * Why a worktree is kept, or why it may go. (`not-agent-worktree` is retired:
77
+ * location no longer decides eligibility, only the idle threshold.)
78
+ */
79
+ export type WorktreeReason = 'main-worktree' | 'bare' | 'prunable' | 'locked' | 'managed-by-workitem-worktrees' | 'agent-session-inside' | 'process-inside' | 'cwd-probe-failed' | 'recent' | 'dirty' | 'status-failed' | 'not-merged' | 'merged' | 'pr-merged';
55
80
  /** Verdict for one worktree (the dry-run output). */
56
81
  export interface WorktreeVerdict {
57
82
  /** Main worktree of the repo this worktree belongs to */
@@ -104,7 +129,30 @@ export interface JanitorRunSummary {
104
129
  keptReasons: Record<string, number>;
105
130
  /** Per-worktree results */
106
131
  worktrees: WorktreeOutcome[];
132
+ /** True when free space was below LOW_DISK_BYTES at the start (thresholds halved) */
133
+ lowDisk: boolean;
134
+ /** Free bytes on the CREWLY_HOME volume at the start, or null when unknown */
135
+ freeBytes: number | null;
136
+ /** Stale scratch sweep result */
137
+ scratch: ScratchSweepSummary | null;
107
138
  }
139
+ /** What one low-disk check did. */
140
+ export interface LowDiskCheckResult {
141
+ /** Free bytes before (null when statfs failed) */
142
+ freeBytesBefore: number | null;
143
+ /** Free bytes after the cleanup pass (same as before when no pass ran) */
144
+ freeBytesAfter: number | null;
145
+ /** True when a cleanup pass ran */
146
+ ranPass: boolean;
147
+ /** Owner notice sent, if any */
148
+ notified: 'urgent' | 'normal' | null;
149
+ }
150
+ /** Owner notice about low disk. Returns true when it was delivered. */
151
+ export type LowDiskNotifier = (notice: {
152
+ title: string;
153
+ message: string;
154
+ urgent: boolean;
155
+ }) => Promise<boolean>;
108
156
  /** A place a live process or agent is working in. */
109
157
  export interface BusyCwd {
110
158
  /** Absolute directory */
@@ -129,10 +177,26 @@ export interface WorktreeJanitorOptions {
129
177
  ghBin?: string | null;
130
178
  /** Clock (default Date.now) */
131
179
  now?: () => number;
132
- /** Minimum idle time before removal (default 2 h) */
180
+ /** Minimum idle time before removal in an agent location (default 2 h) */
133
181
  minIdleMs?: number;
134
- /** Temp roots whose `crewly-worktrees/` holds agent worktrees (default `/tmp` + os.tmpdir()) */
182
+ /** Minimum idle time before removal anywhere else (default 24 h) */
183
+ minIdleOtherMs?: number;
184
+ /** Minimum idle time of a scratch session dir (default 3 days) */
185
+ scratchMinIdleMs?: number;
186
+ /** Temp roots whose `crewly-worktrees/` holds agent worktrees, also scanned for repo discovery (default `/tmp` + os.tmpdir()) */
135
187
  tmpRoots?: string[];
188
+ /** Claude Code scratch roots (default `<tmp>/claude-<uid>` variants that exist) */
189
+ scratchRoots?: string[];
190
+ /** Free-space probe (default fs.promises.statfs) */
191
+ statfs?: StatFsFn;
192
+ /** Path whose volume is watched (default CREWLY_HOME) */
193
+ diskPath?: string;
194
+ /** Owner notifier for low disk (default: none — set by the server via setLowDiskNotifier) */
195
+ notifyOwner?: LowDiskNotifier | null;
196
+ /** Size probe for removed / kept items (default `du -sk`) */
197
+ sizeOf?: (p: string) => Promise<number | null>;
198
+ /** Low-disk notice state file (default `<CREWLY_HOME>/disk-janitor-state.json`); null = in memory */
199
+ statePath?: string | null;
136
200
  /** Environment for the kill switch (default process.env) */
137
201
  env?: NodeJS.ProcessEnv;
138
202
  /** Logger (default: component logger `WorktreeJanitor`) */
@@ -159,10 +223,22 @@ export declare class WorktreeJanitorService {
159
223
  private ghUsable;
160
224
  private lastSummary;
161
225
  private loggerInstance;
226
+ private diskTimer;
227
+ private diskCheckInFlight;
228
+ private lastPassAt;
229
+ private memoryNoticeState;
230
+ private notifier;
162
231
  /**
163
232
  * @param options - Injectable dependencies; defaults use the live backend
164
233
  */
165
234
  constructor(options?: WorktreeJanitorOptions);
235
+ /**
236
+ * Set how the owner is told about low disk (the server wires the existing
237
+ * Slack owner-notification path here).
238
+ *
239
+ * @param notifier - Sender, or null to disable notices
240
+ */
241
+ setLowDiskNotifier(notifier: LowDiskNotifier | null): void;
166
242
  /**
167
243
  * Process-wide instance used by the server and the HTTP routes.
168
244
  *
@@ -179,13 +255,33 @@ export declare class WorktreeJanitorService {
179
255
  isDisabled(): boolean;
180
256
  /**
181
257
  * Schedule the periodic pass: first after FIRST_RUN_DELAY_MS, then every
182
- * INTERVAL_MS. No-op when disabled or already started. Timers are unref'd.
258
+ * INTERVAL_MS; plus the low-disk check every LOW_DISK_CHECK_INTERVAL_MS.
259
+ * No-op when disabled or already started. Timers are unref'd.
183
260
  *
184
261
  * @returns True when scheduled
185
262
  */
186
263
  start(): boolean;
187
264
  /** Cancel scheduled passes. */
188
265
  stop(): void;
266
+ /**
267
+ * Current free space of the watched volume.
268
+ *
269
+ * @returns Watched path, free bytes (null when unknown) and level
270
+ */
271
+ diskStatus(): Promise<{
272
+ path: string;
273
+ freeBytes: number | null;
274
+ level: 'ok' | 'low' | 'critical' | 'unknown';
275
+ }>;
276
+ /**
277
+ * Low-disk check: read free space; below LOW_DISK_BYTES run a pass now
278
+ * (unless one ran within LOW_DISK_PASS_GAP_MS), then, if space is still
279
+ * short, tell the owner within the notice cadence. Never throws. Honours
280
+ * the kill switch. Concurrent calls share the check in flight.
281
+ *
282
+ * @returns What the check did
283
+ */
284
+ checkDisk(): Promise<LowDiskCheckResult>;
189
285
  /**
190
286
  * Summary of the last completed real pass, if any.
191
287
  *
@@ -207,11 +303,22 @@ export declare class WorktreeJanitorService {
207
303
  */
208
304
  run(): Promise<JanitorRunSummary>;
209
305
  private get logger();
306
+ private now;
307
+ private diskPath;
308
+ private scratchRoots;
309
+ private tmpRoots;
310
+ private statePath;
311
+ private readNoticeState;
312
+ private writeNoticeState;
313
+ private doCheckDisk;
314
+ /** Sizes of everything a pass left on disk that the owner could act on. */
315
+ private keptItems;
210
316
  private git;
211
317
  private pass;
212
318
  private resolveRepos;
213
319
  private safeBusyCwds;
214
- private isAgentWorktree;
320
+ /** Known agent location (short idle threshold) vs anywhere else (long one). */
321
+ private isAgentLocation;
215
322
  /**
216
323
  * Apply the removal rules to one worktree (read-only apart from fetch).
217
324
  */
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-janitor.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/worktree/worktree-janitor.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worktree-janitor.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/worktree/worktree-janitor.service.ts"],"names":[],"mappings":"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"}