crewly 1.20.358 → 1.20.360

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 (137) hide show
  1. package/config/roles/developer/prompt.md +3 -1
  2. package/config/skills/registry.json +125 -1
  3. package/dist/backend/backend/src/constants.d.ts +189 -2
  4. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  5. package/dist/backend/backend/src/constants.js +200 -3
  6. package/dist/backend/backend/src/constants.js.map +1 -1
  7. package/dist/backend/backend/src/index.d.ts +58 -0
  8. package/dist/backend/backend/src/index.d.ts.map +1 -1
  9. package/dist/backend/backend/src/index.js +263 -19
  10. package/dist/backend/backend/src/index.js.map +1 -1
  11. package/dist/backend/backend/src/services/agent/boot-pressure.d.ts +147 -0
  12. package/dist/backend/backend/src/services/agent/boot-pressure.d.ts.map +1 -0
  13. package/dist/backend/backend/src/services/agent/boot-pressure.js +212 -0
  14. package/dist/backend/backend/src/services/agent/boot-pressure.js.map +1 -0
  15. package/dist/backend/backend/src/services/agent/restore-queue.d.ts +50 -1
  16. package/dist/backend/backend/src/services/agent/restore-queue.d.ts.map +1 -1
  17. package/dist/backend/backend/src/services/agent/restore-queue.js +100 -5
  18. package/dist/backend/backend/src/services/agent/restore-queue.js.map +1 -1
  19. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts +11 -0
  20. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts.map +1 -1
  21. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js +28 -2
  22. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js.map +1 -1
  23. package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts +10 -0
  24. package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -1
  25. package/dist/backend/backend/src/services/memory/startup-briefing.service.js +65 -22
  26. package/dist/backend/backend/src/services/memory/startup-briefing.service.js.map +1 -1
  27. package/dist/backend/backend/src/services/messaging/deferred-start-retry.d.ts +8 -0
  28. package/dist/backend/backend/src/services/messaging/deferred-start-retry.d.ts.map +1 -1
  29. package/dist/backend/backend/src/services/messaging/deferred-start-retry.js +8 -0
  30. package/dist/backend/backend/src/services/messaging/deferred-start-retry.js.map +1 -1
  31. package/dist/backend/backend/src/services/session/session-binding.d.ts +25 -2
  32. package/dist/backend/backend/src/services/session/session-binding.d.ts.map +1 -1
  33. package/dist/backend/backend/src/services/session/session-binding.js +32 -4
  34. package/dist/backend/backend/src/services/session/session-binding.js.map +1 -1
  35. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  36. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  37. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  38. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts +27 -2
  39. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js +105 -8
  41. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js.map +1 -1
  42. package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts +7 -0
  43. package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -1
  44. package/dist/backend/backend/src/services/wiki/wiki-log-entries.js +10 -0
  45. package/dist/backend/backend/src/services/wiki/wiki-log-entries.js.map +1 -1
  46. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts +24 -0
  47. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js +75 -9
  49. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js.map +1 -1
  50. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts +19 -0
  51. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js +23 -2
  53. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js.map +1 -1
  54. package/dist/backend/backend/src/services/wiki/work-record-transcript.d.ts +64 -0
  55. package/dist/backend/backend/src/services/wiki/work-record-transcript.d.ts.map +1 -0
  56. package/dist/backend/backend/src/services/wiki/work-record-transcript.js +194 -0
  57. package/dist/backend/backend/src/services/wiki/work-record-transcript.js.map +1 -0
  58. package/dist/backend/backend/src/services/wiki/work-record.d.ts +239 -0
  59. package/dist/backend/backend/src/services/wiki/work-record.d.ts.map +1 -0
  60. package/dist/backend/backend/src/services/wiki/work-record.js +631 -0
  61. package/dist/backend/backend/src/services/wiki/work-record.js.map +1 -0
  62. package/dist/backend/backend/src/services/wiki/work-record.service.d.ts +231 -0
  63. package/dist/backend/backend/src/services/wiki/work-record.service.d.ts.map +1 -0
  64. package/dist/backend/backend/src/services/wiki/work-record.service.js +542 -0
  65. package/dist/backend/backend/src/services/wiki/work-record.service.js.map +1 -0
  66. package/dist/backend/backend/src/services/worktree/low-disk-guard.d.ts +92 -8
  67. package/dist/backend/backend/src/services/worktree/low-disk-guard.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/worktree/low-disk-guard.js +98 -14
  69. package/dist/backend/backend/src/services/worktree/low-disk-guard.js.map +1 -1
  70. package/dist/backend/backend/src/services/worktree/tmp-janitor.d.ts +138 -0
  71. package/dist/backend/backend/src/services/worktree/tmp-janitor.d.ts.map +1 -0
  72. package/dist/backend/backend/src/services/worktree/tmp-janitor.js +199 -0
  73. package/dist/backend/backend/src/services/worktree/tmp-janitor.js.map +1 -0
  74. package/dist/backend/backend/src/services/worktree/transcript-janitor.d.ts +154 -0
  75. package/dist/backend/backend/src/services/worktree/transcript-janitor.d.ts.map +1 -0
  76. package/dist/backend/backend/src/services/worktree/transcript-janitor.js +357 -0
  77. package/dist/backend/backend/src/services/worktree/transcript-janitor.js.map +1 -0
  78. package/dist/backend/backend/src/services/worktree/workitem-worktree.service.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/worktree/workitem-worktree.service.js +7 -2
  80. package/dist/backend/backend/src/services/worktree/workitem-worktree.service.js.map +1 -1
  81. package/dist/backend/backend/src/services/worktree/worktree-dirty.d.ts +16 -4
  82. package/dist/backend/backend/src/services/worktree/worktree-dirty.d.ts.map +1 -1
  83. package/dist/backend/backend/src/services/worktree/worktree-dirty.js +21 -5
  84. package/dist/backend/backend/src/services/worktree/worktree-dirty.js.map +1 -1
  85. package/dist/backend/backend/src/services/worktree/worktree-git.d.ts +18 -0
  86. package/dist/backend/backend/src/services/worktree/worktree-git.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/worktree/worktree-git.js +60 -0
  88. package/dist/backend/backend/src/services/worktree/worktree-git.js.map +1 -1
  89. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +164 -25
  90. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
  91. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +494 -55
  92. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
  93. package/dist/backend/backend/src/services/worktree/worktree-tiers.d.ts +186 -0
  94. package/dist/backend/backend/src/services/worktree/worktree-tiers.d.ts.map +1 -0
  95. package/dist/backend/backend/src/services/worktree/worktree-tiers.js +279 -0
  96. package/dist/backend/backend/src/services/worktree/worktree-tiers.js.map +1 -0
  97. package/dist/backend/build-info.json +2 -2
  98. package/dist/cli/backend/src/constants.d.ts +189 -2
  99. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  100. package/dist/cli/backend/src/constants.js +200 -3
  101. package/dist/cli/backend/src/constants.js.map +1 -1
  102. package/dist/cli/backend/src/services/agent/boot-pressure.d.ts +147 -0
  103. package/dist/cli/backend/src/services/agent/boot-pressure.d.ts.map +1 -0
  104. package/dist/cli/backend/src/services/agent/boot-pressure.js +212 -0
  105. package/dist/cli/backend/src/services/agent/boot-pressure.js.map +1 -0
  106. package/dist/cli/backend/src/services/agent/restore-queue.d.ts +50 -1
  107. package/dist/cli/backend/src/services/agent/restore-queue.d.ts.map +1 -1
  108. package/dist/cli/backend/src/services/agent/restore-queue.js +100 -5
  109. package/dist/cli/backend/src/services/agent/restore-queue.js.map +1 -1
  110. package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts +10 -0
  111. package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -1
  112. package/dist/cli/backend/src/services/memory/startup-briefing.service.js +65 -22
  113. package/dist/cli/backend/src/services/memory/startup-briefing.service.js.map +1 -1
  114. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  115. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  116. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  117. package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts +7 -0
  118. package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -1
  119. package/dist/cli/backend/src/services/wiki/wiki-log-entries.js +10 -0
  120. package/dist/cli/backend/src/services/wiki/wiki-log-entries.js.map +1 -1
  121. package/dist/cli/backend/src/services/wiki/work-record-transcript.d.ts +64 -0
  122. package/dist/cli/backend/src/services/wiki/work-record-transcript.d.ts.map +1 -0
  123. package/dist/cli/backend/src/services/wiki/work-record-transcript.js +194 -0
  124. package/dist/cli/backend/src/services/wiki/work-record-transcript.js.map +1 -0
  125. package/dist/cli/backend/src/services/wiki/work-record.d.ts +239 -0
  126. package/dist/cli/backend/src/services/wiki/work-record.d.ts.map +1 -0
  127. package/dist/cli/backend/src/services/wiki/work-record.js +631 -0
  128. package/dist/cli/backend/src/services/wiki/work-record.js.map +1 -0
  129. package/dist/cli/backend/src/services/worktree/low-disk-guard.d.ts +92 -8
  130. package/dist/cli/backend/src/services/worktree/low-disk-guard.d.ts.map +1 -1
  131. package/dist/cli/backend/src/services/worktree/low-disk-guard.js +98 -14
  132. package/dist/cli/backend/src/services/worktree/low-disk-guard.js.map +1 -1
  133. package/dist/cli/backend/src/services/worktree/worktree-git.d.ts +18 -0
  134. package/dist/cli/backend/src/services/worktree/worktree-git.d.ts.map +1 -1
  135. package/dist/cli/backend/src/services/worktree/worktree-git.js +60 -0
  136. package/dist/cli/backend/src/services/worktree/worktree-git.js.map +1 -1
  137. package/package.json +1 -1
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Tmp and log janitor — retention for `<CREWLY_HOME>/tmp` and size caps for
3
+ * `<CREWLY_HOME>/logs/archive` and `logs/sessions` (crewly#1354).
4
+ *
5
+ * `~/.crewly/tmp` is where agents, skills and Crewly itself put scratch
6
+ * output (Slack downloads, release build dirs, previews, skill output) and
7
+ * nothing ever removed it (600 MB on one Mac); the log archive had a 7-day
8
+ * rule but no cap (600 MB) and session logs none at all (200 MB).
9
+ *
10
+ * Tmp rules: a top-level entry untouched (shallow tree mtime) for 7 days is
11
+ * removed. Some sub-directories are swept per child with their own age
12
+ * instead (`slack-files` / `slack-images` / `slack-pdfs` 30 days,
13
+ * `crewly-web-release` 2 days, `skill-output` 7 days) and the directory itself
14
+ * stays. Never removed: symlinks, anything a process or agent session has as
15
+ * cwd, and any entry holding a git checkout — a linked worktree in tmp
16
+ * belongs to the worktree rules (the service adds tmp to their discovery
17
+ * roots), and a clone may be the only copy of its history.
18
+ *
19
+ * Log caps: the oldest files go first until the directory fits; a file
20
+ * written in the last hour, or the log of a live session, is never deleted.
21
+ *
22
+ * @module services/worktree/tmp-janitor
23
+ */
24
+ import * as fs from 'fs';
25
+ import * as path from 'path';
26
+ import { WORKTREE_JANITOR_CONSTANTS } from '../../constants.js';
27
+ import { EventLoopYielder, findGitCheckouts, isPathInside, latestTreeMtimeMs } from './worktree-janitor.git.js';
28
+ /** Bytes of a path by a bounded stat walk (no symlinks followed). */
29
+ export async function shallowBytes(p, depth = 6) {
30
+ let total = 0;
31
+ const yielder = new EventLoopYielder();
32
+ const walk = async (q, level) => {
33
+ await yielder.tick();
34
+ let st;
35
+ try {
36
+ st = await fs.promises.lstat(q);
37
+ }
38
+ catch {
39
+ return;
40
+ }
41
+ total += st.size;
42
+ if (!st.isDirectory() || level >= depth)
43
+ return;
44
+ let names;
45
+ try {
46
+ names = await fs.promises.readdir(q);
47
+ }
48
+ catch {
49
+ return;
50
+ }
51
+ for (const n of names)
52
+ await walk(path.join(q, n), level + 1);
53
+ };
54
+ await walk(p, 0);
55
+ return total;
56
+ }
57
+ /**
58
+ * One sweep of the tmp root. Never throws; an unreadable root yields an
59
+ * empty summary.
60
+ *
61
+ * @param input - Root, busy cwds, clock, dry-run flag
62
+ * @returns What was removed and kept
63
+ */
64
+ export async function sweepTmp(input) {
65
+ const summary = { root: input.root, removed: 0, wouldRemove: 0, freedBytes: 0, wouldFreeBytes: 0, kept: 0, keptReasons: {}, entries: [] };
66
+ const policies = input.childPolicies ?? WORKTREE_JANITOR_CONSTANTS.TMP_CHILD_POLICIES;
67
+ const defaultAge = input.maxAgeMs ?? WORKTREE_JANITOR_CONSTANTS.TMP_MAX_AGE_MS;
68
+ let top;
69
+ try {
70
+ top = await fs.promises.readdir(input.root, { withFileTypes: true });
71
+ }
72
+ catch {
73
+ return summary;
74
+ }
75
+ const keep = (v) => {
76
+ summary.kept += 1;
77
+ summary.keptReasons[v.reason] = (summary.keptReasons[v.reason] ?? 0) + 1;
78
+ if (v.reason !== 'recent')
79
+ summary.entries.push(v);
80
+ };
81
+ const sizeOf = async (p) => (input.sizeOf ? await input.sizeOf(p) : null) ?? (await shallowBytes(p));
82
+ const consider = async (entry, full, maxAge) => {
83
+ const base = { path: full, bytes: 0, removed: false };
84
+ if (entry.isSymbolicLink())
85
+ return keep({ ...base, decision: 'keep', reason: 'symlink' });
86
+ if (input.busy === null)
87
+ return keep({ ...base, decision: 'keep', reason: 'cwd-probe-failed' });
88
+ const hit = input.busy.find((b) => isPathInside(b.cwd, full));
89
+ if (hit)
90
+ return keep({ ...base, decision: 'keep', reason: hit.source === 'agent-session' ? 'agent-session-inside' : 'process-inside' });
91
+ const mtime = await latestTreeMtimeMs(full, WORKTREE_JANITOR_CONSTANTS.TMP_MTIME_DEPTH);
92
+ const idleMs = mtime === null ? undefined : Math.max(0, input.now - mtime);
93
+ if (idleMs === undefined || idleMs < maxAge)
94
+ return keep({ ...base, decision: 'keep', reason: 'recent', idleMs });
95
+ if (entry.isDirectory()) {
96
+ const repos = await findGitCheckouts(full, WORKTREE_JANITOR_CONSTANTS.TMP_MTIME_DEPTH, 5000);
97
+ if (repos.length > 0)
98
+ return keep({ ...base, decision: 'keep', reason: 'contains-git', idleMs });
99
+ }
100
+ const bytes = await sizeOf(full);
101
+ const verdict = { ...base, bytes, decision: 'remove', reason: 'old', idleMs };
102
+ if (input.dryRun) {
103
+ summary.wouldRemove += 1;
104
+ summary.wouldFreeBytes += bytes;
105
+ summary.entries.push(verdict);
106
+ return;
107
+ }
108
+ try {
109
+ await fs.promises.rm(full, { recursive: true, force: true });
110
+ verdict.removed = true;
111
+ summary.removed += 1;
112
+ summary.freedBytes += bytes;
113
+ summary.entries.push(verdict);
114
+ }
115
+ catch (err) {
116
+ keep({ ...verdict, decision: 'keep', reason: 'remove-failed', error: err instanceof Error ? err.message : String(err) });
117
+ }
118
+ };
119
+ const yielder = new EventLoopYielder();
120
+ for (const entry of top) {
121
+ await yielder.tick();
122
+ const full = path.join(input.root, entry.name);
123
+ const childAge = policies[entry.name];
124
+ if (childAge !== undefined && entry.isDirectory()) {
125
+ let children;
126
+ try {
127
+ children = await fs.promises.readdir(full, { withFileTypes: true });
128
+ }
129
+ catch {
130
+ continue;
131
+ }
132
+ for (const child of children)
133
+ await consider(child, path.join(full, child.name), childAge);
134
+ continue;
135
+ }
136
+ await consider(entry, full, defaultAge);
137
+ }
138
+ return summary;
139
+ }
140
+ /**
141
+ * Delete the oldest files of a directory until it fits the cap. Never
142
+ * throws; an unreadable directory yields an empty summary.
143
+ *
144
+ * @param input - Directory, cap, filters, clock, dry-run flag
145
+ * @returns What was deleted and what still exceeds the cap
146
+ */
147
+ export async function capDirectoryBytes(input) {
148
+ const summary = { dir: input.dir, totalBytes: 0, capBytes: input.capBytes, deleted: [], freedBytes: 0, wouldDelete: [], wouldFreeBytes: 0, overCapBytes: 0 };
149
+ let names;
150
+ try {
151
+ names = await fs.promises.readdir(input.dir);
152
+ }
153
+ catch {
154
+ return summary;
155
+ }
156
+ const minAge = input.minAgeMs ?? WORKTREE_JANITOR_CONSTANTS.LOG_CAP_MIN_AGE_MS;
157
+ const files = [];
158
+ for (const name of names) {
159
+ if (input.filter && !input.filter(name))
160
+ continue;
161
+ try {
162
+ const st = await fs.promises.lstat(path.join(input.dir, name));
163
+ if (!st.isFile())
164
+ continue;
165
+ const locked = (input.protect?.(name) ?? false) || input.now - st.mtimeMs < minAge;
166
+ files.push({ name, bytes: st.size, mtimeMs: st.mtimeMs, locked });
167
+ summary.totalBytes += st.size;
168
+ }
169
+ catch {
170
+ // vanished
171
+ }
172
+ }
173
+ let total = summary.totalBytes;
174
+ files.sort((a, b) => a.mtimeMs - b.mtimeMs);
175
+ for (const f of files) {
176
+ if (total <= input.capBytes)
177
+ break;
178
+ if (f.locked)
179
+ continue;
180
+ if (input.dryRun) {
181
+ summary.wouldDelete.push(f.name);
182
+ summary.wouldFreeBytes += f.bytes;
183
+ total -= f.bytes;
184
+ continue;
185
+ }
186
+ try {
187
+ await fs.promises.unlink(path.join(input.dir, f.name));
188
+ summary.deleted.push(f.name);
189
+ summary.freedBytes += f.bytes;
190
+ total -= f.bytes;
191
+ }
192
+ catch {
193
+ // busy — try the next one
194
+ }
195
+ }
196
+ summary.overCapBytes = Math.max(0, total - input.capBytes);
197
+ return summary;
198
+ }
199
+ //# sourceMappingURL=tmp-janitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmp-janitor.js","sourceRoot":"","sources":["../../../../../../backend/src/services/worktree/tmp-janitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Transcript janitor — prunes Claude Code conversation transcripts of
3
+ * sessions Crewly launched (crewly#1354).
4
+ *
5
+ * Claude Code keeps every conversation under `<claude home>/projects/<cwd
6
+ * slug>/<id>.jsonl`, plus a sibling `<id>/` dir of tool results, and cleans
7
+ * them up after 30 days at most. Agents write far more than a person: one
8
+ * Mac held 10 GB, half older than a week. Agents on the default account share
9
+ * `~/.claude` with the owner's own sessions, so a blanket shorter retention
10
+ * would hit the owner too. This sweep therefore prunes only conversations it
11
+ * can prove Crewly launched:
12
+ *
13
+ * - the conversation id is one Crewly recorded (`session-state.json`,
14
+ * `last-conversations.json`, a handover file), or
15
+ * - the transcript's head carries Claude Code's `agentSetting` entry naming
16
+ * a known Crewly session (Crewly launches `claude --agent <session>`).
17
+ *
18
+ * Everything else is `foreign` and never touched. A transcript (and its
19
+ * sibling dir) goes when it is Crewly-launched, untouched for 14 days, and
20
+ * not the current conversation of a live or persisted session (`keepIds`).
21
+ * The first real pass only logs; deletion starts the next day (the service's
22
+ * arming rule).
23
+ *
24
+ * @module services/worktree/transcript-janitor
25
+ */
26
+ /** What identifies Crewly's conversations. */
27
+ export interface TranscriptSources {
28
+ /** Session names Crewly has launched (teams, persisted sessions, handover files, the orchestrator) */
29
+ knownSessionNames: ReadonlySet<string>;
30
+ /** Conversation ids Crewly recorded anywhere */
31
+ recordedIds: ReadonlySet<string>;
32
+ /** Conversation ids of live / persisted / remembered sessions — never pruned */
33
+ keepIds: ReadonlySet<string>;
34
+ }
35
+ /** Why a transcript was pruned or kept. */
36
+ export type TranscriptReason = 'old' | 'live-session' | 'recent' | 'foreign' | 'remove-failed';
37
+ /** Verdict for one transcript. */
38
+ export interface TranscriptVerdict {
39
+ /** Transcript file */
40
+ path: string;
41
+ /** Conversation id */
42
+ id: string;
43
+ /** Bytes of the transcript plus its sibling dir */
44
+ bytes: number;
45
+ /** What the sweep decided */
46
+ decision: 'prune' | 'keep';
47
+ /** The deciding rule */
48
+ reason: TranscriptReason;
49
+ /** `agentSetting` found in the head, when read */
50
+ agentSetting?: string | null;
51
+ /** True when deleted */
52
+ removed: boolean;
53
+ /** Error text when deletion failed */
54
+ error?: string;
55
+ }
56
+ /** Result of one transcript sweep. */
57
+ export interface TranscriptSweepSummary {
58
+ /** Claude homes scanned */
59
+ homes: string[];
60
+ /** Transcripts seen */
61
+ scanned: number;
62
+ /** Transcripts identified as Crewly-launched (any age) */
63
+ crewlyLaunched: number;
64
+ /** Deleted */
65
+ pruned: number;
66
+ /** Dry run: would be deleted */
67
+ wouldPrune: number;
68
+ /** Bytes freed */
69
+ freedBytes: number;
70
+ /** Dry run: bytes that would be freed */
71
+ wouldFreeBytes: number;
72
+ /** Kept, by reason (`recent` and `foreign` are counted here but not listed) */
73
+ keptReasons: Record<string, number>;
74
+ /** Verdicts for pruned / would-prune / live-session / failed transcripts */
75
+ transcripts: TranscriptVerdict[];
76
+ }
77
+ /** Input of {@link sweepTranscripts}. */
78
+ export interface TranscriptSweepInput {
79
+ /** Claude homes (`~/.claude`, each account's config dir) */
80
+ claudeHomes: readonly string[];
81
+ /** What identifies Crewly's conversations */
82
+ sources: TranscriptSources;
83
+ /** Current time (ms) */
84
+ now: number;
85
+ /** Max age before pruning (default TRANSCRIPT_MAX_AGE_MS) */
86
+ maxAgeMs?: number;
87
+ /** When true, nothing is deleted */
88
+ dryRun: boolean;
89
+ /** Size probe for sibling dirs (default: shallow stat walk) */
90
+ sizeOf?: (p: string) => Promise<number | null>;
91
+ /** Bytes read from a transcript head (default TRANSCRIPT_HEAD_BYTES) */
92
+ headBytes?: number;
93
+ }
94
+ /**
95
+ * The `agentSetting` Claude Code wrote at the top of a transcript, if any.
96
+ * Only the first `headBytes` are read.
97
+ *
98
+ * @param file - Transcript
99
+ * @param headBytes - Bytes to read (default TRANSCRIPT_HEAD_BYTES)
100
+ * @returns The agent name, or null when absent / unreadable
101
+ */
102
+ export declare function readAgentSetting(file: string, headBytes?: number): string | null;
103
+ /**
104
+ * Session name a handover file belongs to, from its name.
105
+ *
106
+ * @param fileName - `crewly-orc-restart-2026-10-10T22-44-14-888Z.md`
107
+ * @returns `crewly-orc`, or null when the name has another shape
108
+ */
109
+ export declare function sessionNameFromHandoverFile(fileName: string): string | null;
110
+ /**
111
+ * Every UUID in a text (lower-cased, de-duplicated).
112
+ *
113
+ * @param text - Any text
114
+ * @returns Ids
115
+ */
116
+ export declare function collectUuids(text: string): string[];
117
+ /**
118
+ * Claude homes to sweep: `~/.claude` and every account config dir under
119
+ * `<CREWLY_HOME>/claude-accounts/` that has a `projects/` folder.
120
+ *
121
+ * @param crewlyHome - CREWLY_HOME
122
+ * @param defaultHome - The default Claude home (default `~/.claude`)
123
+ * @returns Existing homes, de-duplicated
124
+ */
125
+ export declare function defaultClaudeHomes(crewlyHome: string, defaultHome?: string): string[];
126
+ /** Mutable builder for {@link TranscriptSources}. */
127
+ export interface TranscriptSourceSets {
128
+ knownSessionNames: Set<string>;
129
+ recordedIds: Set<string>;
130
+ keepIds: Set<string>;
131
+ }
132
+ /**
133
+ * Read Crewly's own records under CREWLY_HOME: `session-state.json`
134
+ * (persisted sessions: names + current ids, kept), `last-conversations.json`
135
+ * (stopped sessions: names + ids, kept) and the handover dir (names from file
136
+ * names; ids from the bodies of files newer than 30 days, recorded). Pure
137
+ * file reads — the live session backend and the teams store are added by the
138
+ * service.
139
+ *
140
+ * @param crewlyHome - CREWLY_HOME
141
+ * @param now - Current time (ms)
142
+ * @param into - Sets to add to (default: new ones)
143
+ * @returns The sets
144
+ */
145
+ export declare function readCrewlyRecords(crewlyHome: string, now: number, into?: TranscriptSourceSets): Promise<TranscriptSourceSets>;
146
+ /**
147
+ * One transcript sweep over the given Claude homes. Never throws; a home or
148
+ * project dir that cannot be read is skipped.
149
+ *
150
+ * @param input - Homes, sources, clock, dry-run flag
151
+ * @returns What was pruned and kept
152
+ */
153
+ export declare function sweepTranscripts(input: TranscriptSweepInput): Promise<TranscriptSweepSummary>;
154
+ //# sourceMappingURL=transcript-janitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-janitor.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/worktree/transcript-janitor.ts"],"names":[],"mappings":"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"}