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.
- package/config/roles/developer/prompt.md +3 -1
- package/config/skills/registry.json +125 -1
- package/dist/backend/backend/src/constants.d.ts +189 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +200 -3
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +58 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +263 -19
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/boot-pressure.d.ts +147 -0
- package/dist/backend/backend/src/services/agent/boot-pressure.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/boot-pressure.js +212 -0
- package/dist/backend/backend/src/services/agent/boot-pressure.js.map +1 -0
- package/dist/backend/backend/src/services/agent/restore-queue.d.ts +50 -1
- package/dist/backend/backend/src/services/agent/restore-queue.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/restore-queue.js +100 -5
- package/dist/backend/backend/src/services/agent/restore-queue.js.map +1 -1
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts +11 -0
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js +28 -2
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts +10 -0
- package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/startup-briefing.service.js +65 -22
- package/dist/backend/backend/src/services/memory/startup-briefing.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/deferred-start-retry.d.ts +8 -0
- package/dist/backend/backend/src/services/messaging/deferred-start-retry.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/deferred-start-retry.js +8 -0
- package/dist/backend/backend/src/services/messaging/deferred-start-retry.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-binding.d.ts +25 -2
- package/dist/backend/backend/src/services/session/session-binding.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-binding.js +32 -4
- package/dist/backend/backend/src/services/session/session-binding.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts +27 -2
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js +105 -8
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts +7 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.js +10 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts +24 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js +75 -9
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts +19 -0
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js +23 -2
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/work-record-transcript.d.ts +64 -0
- package/dist/backend/backend/src/services/wiki/work-record-transcript.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/work-record-transcript.js +194 -0
- package/dist/backend/backend/src/services/wiki/work-record-transcript.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/work-record.d.ts +239 -0
- package/dist/backend/backend/src/services/wiki/work-record.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/work-record.js +631 -0
- package/dist/backend/backend/src/services/wiki/work-record.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/work-record.service.d.ts +231 -0
- package/dist/backend/backend/src/services/wiki/work-record.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/work-record.service.js +542 -0
- package/dist/backend/backend/src/services/wiki/work-record.service.js.map +1 -0
- package/dist/backend/backend/src/services/worktree/low-disk-guard.d.ts +92 -8
- package/dist/backend/backend/src/services/worktree/low-disk-guard.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/low-disk-guard.js +98 -14
- package/dist/backend/backend/src/services/worktree/low-disk-guard.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/tmp-janitor.d.ts +138 -0
- package/dist/backend/backend/src/services/worktree/tmp-janitor.d.ts.map +1 -0
- package/dist/backend/backend/src/services/worktree/tmp-janitor.js +199 -0
- package/dist/backend/backend/src/services/worktree/tmp-janitor.js.map +1 -0
- package/dist/backend/backend/src/services/worktree/transcript-janitor.d.ts +154 -0
- package/dist/backend/backend/src/services/worktree/transcript-janitor.d.ts.map +1 -0
- package/dist/backend/backend/src/services/worktree/transcript-janitor.js +357 -0
- package/dist/backend/backend/src/services/worktree/transcript-janitor.js.map +1 -0
- package/dist/backend/backend/src/services/worktree/workitem-worktree.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/workitem-worktree.service.js +7 -2
- package/dist/backend/backend/src/services/worktree/workitem-worktree.service.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-dirty.d.ts +16 -4
- package/dist/backend/backend/src/services/worktree/worktree-dirty.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-dirty.js +21 -5
- package/dist/backend/backend/src/services/worktree/worktree-dirty.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-git.d.ts +18 -0
- package/dist/backend/backend/src/services/worktree/worktree-git.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-git.js +60 -0
- package/dist/backend/backend/src/services/worktree/worktree-git.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +164 -25
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +494 -55
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-tiers.d.ts +186 -0
- package/dist/backend/backend/src/services/worktree/worktree-tiers.d.ts.map +1 -0
- package/dist/backend/backend/src/services/worktree/worktree-tiers.js +279 -0
- package/dist/backend/backend/src/services/worktree/worktree-tiers.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +189 -2
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +200 -3
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/boot-pressure.d.ts +147 -0
- package/dist/cli/backend/src/services/agent/boot-pressure.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/boot-pressure.js +212 -0
- package/dist/cli/backend/src/services/agent/boot-pressure.js.map +1 -0
- package/dist/cli/backend/src/services/agent/restore-queue.d.ts +50 -1
- package/dist/cli/backend/src/services/agent/restore-queue.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/restore-queue.js +100 -5
- package/dist/cli/backend/src/services/agent/restore-queue.js.map +1 -1
- package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts +10 -0
- package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/startup-briefing.service.js +65 -22
- package/dist/cli/backend/src/services/memory/startup-briefing.service.js.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts +7 -0
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.js +10 -0
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.js.map +1 -1
- package/dist/cli/backend/src/services/wiki/work-record-transcript.d.ts +64 -0
- package/dist/cli/backend/src/services/wiki/work-record-transcript.d.ts.map +1 -0
- package/dist/cli/backend/src/services/wiki/work-record-transcript.js +194 -0
- package/dist/cli/backend/src/services/wiki/work-record-transcript.js.map +1 -0
- package/dist/cli/backend/src/services/wiki/work-record.d.ts +239 -0
- package/dist/cli/backend/src/services/wiki/work-record.d.ts.map +1 -0
- package/dist/cli/backend/src/services/wiki/work-record.js +631 -0
- package/dist/cli/backend/src/services/wiki/work-record.js.map +1 -0
- package/dist/cli/backend/src/services/worktree/low-disk-guard.d.ts +92 -8
- package/dist/cli/backend/src/services/worktree/low-disk-guard.d.ts.map +1 -1
- package/dist/cli/backend/src/services/worktree/low-disk-guard.js +98 -14
- package/dist/cli/backend/src/services/worktree/low-disk-guard.js.map +1 -1
- package/dist/cli/backend/src/services/worktree/worktree-git.d.ts +18 -0
- package/dist/cli/backend/src/services/worktree/worktree-git.d.ts.map +1 -1
- package/dist/cli/backend/src/services/worktree/worktree-git.js +60 -0
- package/dist/cli/backend/src/services/worktree/worktree-git.js.map +1 -1
- package/package.json +1 -1
|
@@ -19,11 +19,64 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import * as path from 'path';
|
|
21
21
|
import * as fs from 'fs/promises';
|
|
22
|
-
import { existsSync } from 'fs';
|
|
22
|
+
import { existsSync, createReadStream } from 'fs';
|
|
23
23
|
import { LoggerService } from '../core/logger.service.js';
|
|
24
|
-
import { WIKI_LOG_CONSTANTS } from '../../constants.js';
|
|
25
|
-
import { WIKI_LOG_HEADER, parseLogEntries, recentContentEntries, serializeLogEntry } from './wiki-log-entries.js';
|
|
24
|
+
import { BOOT_PRESSURE_CONSTANTS, WIKI_LOG_CONSTANTS } from '../../constants.js';
|
|
25
|
+
import { WIKI_LOG_HEADER, isLogEntryHeaderLine, parseLogEntries, recentContentEntries, serializeLogEntry } from './wiki-log-entries.js';
|
|
26
26
|
import { WikiIngestService } from './wiki-ingest.service.js';
|
|
27
|
+
/**
|
|
28
|
+
* Count entry header lines of a log by streaming it in chunks, so a very
|
|
29
|
+
* large log is never held in memory whole.
|
|
30
|
+
*
|
|
31
|
+
* @param file - Absolute log path
|
|
32
|
+
* @returns Number of entries
|
|
33
|
+
*/
|
|
34
|
+
export async function countLogHeaders(file) {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
let count = 0;
|
|
37
|
+
let carry = '';
|
|
38
|
+
const stream = createReadStream(file, { encoding: 'utf8', highWaterMark: BOOT_PRESSURE_CONSTANTS.ROTATION_CHUNK_BYTES });
|
|
39
|
+
stream.on('data', (chunk) => {
|
|
40
|
+
const text = carry + (typeof chunk === 'string' ? chunk : chunk.toString('utf8'));
|
|
41
|
+
const lines = text.split('\n');
|
|
42
|
+
carry = lines.pop() ?? '';
|
|
43
|
+
for (const line of lines)
|
|
44
|
+
if (isLogEntryHeaderLine(line))
|
|
45
|
+
count++;
|
|
46
|
+
});
|
|
47
|
+
stream.on('end', () => {
|
|
48
|
+
if (isLogEntryHeaderLine(carry))
|
|
49
|
+
count++;
|
|
50
|
+
resolve(count);
|
|
51
|
+
});
|
|
52
|
+
stream.on('error', reject);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The last `bytes` of a log, cut at the first entry boundary so it parses
|
|
57
|
+
* as whole entries.
|
|
58
|
+
*
|
|
59
|
+
* @param file - Absolute log path
|
|
60
|
+
* @param size - File size (from stat)
|
|
61
|
+
* @param bytes - How much of the end to read
|
|
62
|
+
* @returns Tail text starting at an entry header (empty when none in the tail)
|
|
63
|
+
*/
|
|
64
|
+
export async function readLogTail(file, size, bytes) {
|
|
65
|
+
const length = Math.min(size, bytes);
|
|
66
|
+
const handle = await fs.open(file, 'r');
|
|
67
|
+
try {
|
|
68
|
+
const buf = Buffer.alloc(length);
|
|
69
|
+
await handle.read(buf, 0, length, size - length);
|
|
70
|
+
const text = buf.toString('utf8');
|
|
71
|
+
if (length >= size)
|
|
72
|
+
return text;
|
|
73
|
+
const at = text.indexOf('\n## [');
|
|
74
|
+
return at < 0 ? '' : text.slice(at + 1);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
await handle.close();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
27
80
|
/**
|
|
28
81
|
* Rotates oversized vault logs into an archive folder. Stateless singleton.
|
|
29
82
|
*/
|
|
@@ -72,13 +125,26 @@ export class WikiLogRotationService {
|
|
|
72
125
|
return { ...base, reason: 'no_log' };
|
|
73
126
|
}
|
|
74
127
|
base.bytes = size;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
128
|
+
let recent;
|
|
129
|
+
if (size > (opts.streamBytes ?? BOOT_PRESSURE_CONSTANTS.ROTATION_STREAM_BYTES)) {
|
|
130
|
+
// A log this large (19 MB on 2026-10-17, crewly#1353) is not read whole:
|
|
131
|
+
// the entry count is streamed and the carry-forward candidates come from
|
|
132
|
+
// the tail. It is over the byte cap already, so it rotates either way.
|
|
133
|
+
const [count, tail] = await Promise.all([countLogHeaders(logAbs), readLogTail(logAbs, size, opts.tailBytes ?? BOOT_PRESSURE_CONSTANTS.ROTATION_TAIL_BYTES)]);
|
|
134
|
+
base.entries = count;
|
|
135
|
+
recent = parseLogEntries(tail);
|
|
136
|
+
base.streamed = true;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
const raw = await fs.readFile(logAbs, 'utf8');
|
|
140
|
+
const entries = parseLogEntries(raw);
|
|
141
|
+
base.entries = entries.length;
|
|
142
|
+
if (size <= maxBytes && entries.length <= maxEntries)
|
|
143
|
+
return { ...base, reason: 'under_caps' };
|
|
144
|
+
recent = entries;
|
|
145
|
+
}
|
|
80
146
|
// Handover snapshots are carried: an agent may still be pointed at one.
|
|
81
|
-
const carried = recentContentEntries(
|
|
147
|
+
const carried = recentContentEntries(recent, WIKI_LOG_CONSTANTS.CARRY_FORWARD_DAYS, now, WIKI_LOG_CONSTANTS.CARRY_FORWARD_MAX_ENTRIES, { includeHandovers: true })
|
|
82
148
|
// Oldest first in the fresh file, like any log.
|
|
83
149
|
.sort((a, b) => a.timestampMs - b.timestampMs);
|
|
84
150
|
const archiveRel = this.archivePathFor(vaultPath, now);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-log-rotation.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-log-rotation.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"wiki-log-rotation.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-log-rotation.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,7 +37,18 @@ export interface WikiMaintenanceOptions {
|
|
|
37
37
|
now?: () => number;
|
|
38
38
|
/** Dry run: every step reports and writes nothing. */
|
|
39
39
|
dryRun?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Held before the boot tick (crewly#1353): resolves when the restore queue
|
|
42
|
+
* is drained and memory is calm, or when it gave up waiting. Default: none.
|
|
43
|
+
*/
|
|
44
|
+
bootGate?: BootGate;
|
|
40
45
|
}
|
|
46
|
+
/** Waits for a quiet machine before a boot pass; `reduced` when it gave up waiting. */
|
|
47
|
+
export type BootGate = () => Promise<{
|
|
48
|
+
reduced: boolean;
|
|
49
|
+
waitedMs: number;
|
|
50
|
+
reason?: string;
|
|
51
|
+
}>;
|
|
41
52
|
/** Outcome of one tick. */
|
|
42
53
|
export interface WikiMaintenanceTickResult {
|
|
43
54
|
drain: WikiQueueDrainResult | null;
|
|
@@ -65,6 +76,7 @@ export declare class WikiMaintenanceService {
|
|
|
65
76
|
private readonly drain;
|
|
66
77
|
private readonly nowFn;
|
|
67
78
|
private readonly dryRun;
|
|
79
|
+
private readonly bootGate;
|
|
68
80
|
private timer;
|
|
69
81
|
private bootTimer;
|
|
70
82
|
private running;
|
|
@@ -80,6 +92,13 @@ export declare class WikiMaintenanceService {
|
|
|
80
92
|
* @returns Whether the scheduler started
|
|
81
93
|
*/
|
|
82
94
|
start(): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* The boot tick: waits at the boot gate (restore queue drained, memory
|
|
97
|
+
* calm) when one is wired, then ticks. Public for tests.
|
|
98
|
+
*
|
|
99
|
+
* @returns What ran
|
|
100
|
+
*/
|
|
101
|
+
bootTick(): Promise<WikiMaintenanceTickResult>;
|
|
83
102
|
/** Stop ticking. Safe to call more than once. */
|
|
84
103
|
stop(): void;
|
|
85
104
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-maintenance.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-maintenance.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,OAAO,EAAE,sBAAsB,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAQjG,kDAAkD;AAClD,MAAM,WAAW,sBAAsB;IACrC,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,iCAAiC;IACjC,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,sDAAsD;IACtD,MAAM,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"wiki-maintenance.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-maintenance.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ export class WikiMaintenanceService {
|
|
|
39
39
|
drain;
|
|
40
40
|
nowFn;
|
|
41
41
|
dryRun;
|
|
42
|
+
bootGate;
|
|
42
43
|
timer = null;
|
|
43
44
|
bootTimer = null;
|
|
44
45
|
running = false;
|
|
@@ -56,6 +57,7 @@ export class WikiMaintenanceService {
|
|
|
56
57
|
this.drain = opts.drain ?? WikiQueueDrainService.getInstance();
|
|
57
58
|
this.nowFn = opts.now ?? (() => Date.now());
|
|
58
59
|
this.dryRun = opts.dryRun === true;
|
|
60
|
+
this.bootGate = opts.bootGate ?? null;
|
|
59
61
|
}
|
|
60
62
|
static getInstance() {
|
|
61
63
|
return this.instance;
|
|
@@ -80,14 +82,33 @@ export class WikiMaintenanceService {
|
|
|
80
82
|
}
|
|
81
83
|
this.bootTimer = setTimeout(() => {
|
|
82
84
|
this.bootTimer = null;
|
|
83
|
-
void this.
|
|
85
|
+
void this.bootTick();
|
|
84
86
|
}, this.bootDelayMs);
|
|
85
87
|
this.bootTimer.unref?.();
|
|
86
88
|
this.timer = setInterval(() => void this.tick(), this.intervalMs);
|
|
87
89
|
this.timer.unref?.();
|
|
88
|
-
this.logger.info('WikiMaintenance started', { intervalMs: this.intervalMs, dailyMs: this.dailyMs, bootDelayMs: this.bootDelayMs, dryRun: this.dryRun });
|
|
90
|
+
this.logger.info('WikiMaintenance started', { intervalMs: this.intervalMs, dailyMs: this.dailyMs, bootDelayMs: this.bootDelayMs, dryRun: this.dryRun, bootGate: !!this.bootGate });
|
|
89
91
|
return true;
|
|
90
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* The boot tick: waits at the boot gate (restore queue drained, memory
|
|
95
|
+
* calm) when one is wired, then ticks. Public for tests.
|
|
96
|
+
*
|
|
97
|
+
* @returns What ran
|
|
98
|
+
*/
|
|
99
|
+
async bootTick() {
|
|
100
|
+
if (this.bootGate) {
|
|
101
|
+
try {
|
|
102
|
+
const gate = await this.bootGate();
|
|
103
|
+
if (gate.waitedMs > 0)
|
|
104
|
+
this.logger.info('WikiMaintenance boot pass waited for a quiet machine', { waitedMs: gate.waitedMs, reduced: gate.reduced, reason: gate.reason });
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
this.logger.warn('WikiMaintenance boot gate failed (running anyway)', { error: err instanceof Error ? err.message : String(err) });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return this.tick();
|
|
111
|
+
}
|
|
91
112
|
/** Stop ticking. Safe to call more than once. */
|
|
92
113
|
stop() {
|
|
93
114
|
if (this.bootTimer) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-maintenance.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-maintenance.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAA4B,MAAM,gCAAgC,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAA6B,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAA6B,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"wiki-maintenance.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-maintenance.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript facts for a work record (#1349).
|
|
3
|
+
*
|
|
4
|
+
* Reads a bounded tail of the doer's Claude Code transcript and keeps only
|
|
5
|
+
* what happened inside the task window: failed tool calls (with whether the
|
|
6
|
+
* same call later succeeded), files written, PR / commit references and
|
|
7
|
+
* messages posted. Only the main chain counts (`isSidechain` entries belong
|
|
8
|
+
* to subagents). Tool results are read for their error flag and the first
|
|
9
|
+
* line of an exit code, never copied.
|
|
10
|
+
*
|
|
11
|
+
* Codex rollouts are not read (their shape differs; the trace covers them).
|
|
12
|
+
*
|
|
13
|
+
* @module services/wiki/work-record-transcript
|
|
14
|
+
*/
|
|
15
|
+
import type { WorkRecordError } from './work-record.js';
|
|
16
|
+
/** What the transcript slice says about a task. */
|
|
17
|
+
export interface TranscriptWindowFacts {
|
|
18
|
+
errors: WorkRecordError[];
|
|
19
|
+
filesWritten: string[];
|
|
20
|
+
urls: string[];
|
|
21
|
+
commits: string[];
|
|
22
|
+
/** Messages the agent posted through a reply / post skill. */
|
|
23
|
+
posts: number;
|
|
24
|
+
/** Tool calls seen inside the window. */
|
|
25
|
+
toolCalls: number;
|
|
26
|
+
}
|
|
27
|
+
/** Task window. */
|
|
28
|
+
export interface TranscriptWindow {
|
|
29
|
+
fromMs: number;
|
|
30
|
+
toMs: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Read the end of a file as whole lines (the first partial line is dropped).
|
|
34
|
+
*
|
|
35
|
+
* @param file - Path
|
|
36
|
+
* @param maxBytes - Bytes from the end
|
|
37
|
+
* @returns Text, '' when the file cannot be read
|
|
38
|
+
*/
|
|
39
|
+
export declare function readTranscriptTail(file: string, maxBytes?: number): Promise<string>;
|
|
40
|
+
/**
|
|
41
|
+
* Facts from whole Claude transcript lines inside a window.
|
|
42
|
+
*
|
|
43
|
+
* @param text - JSONL text (whole lines)
|
|
44
|
+
* @param window - Task window (epoch ms); entries outside it are ignored
|
|
45
|
+
* @param roots - Project roots to make file paths relative to
|
|
46
|
+
* @returns Facts (empty when nothing fell in the window)
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const facts = parseClaudeTranscriptWindow(await readTranscriptTail(file), { fromMs, toMs }, [projectPath]);
|
|
51
|
+
* facts.errors; // [{ what: 'Bash `npm test` exit 1', resolved: 'fixed' }]
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseClaudeTranscriptWindow(text: string, window: TranscriptWindow, roots?: readonly string[]): TranscriptWindowFacts;
|
|
55
|
+
/**
|
|
56
|
+
* Whether a transcript is worth reading for an item that ended at `endedMs`:
|
|
57
|
+
* the tail only holds recent turns.
|
|
58
|
+
*
|
|
59
|
+
* @param endedMs - When the item ended (epoch ms)
|
|
60
|
+
* @param now - Clock
|
|
61
|
+
* @returns True when the window may still be in the tail
|
|
62
|
+
*/
|
|
63
|
+
export declare function transcriptWorthReading(endedMs: number, now?: number): boolean;
|
|
64
|
+
//# sourceMappingURL=work-record-transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-record-transcript.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/work-record-transcript.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIxD,mDAAmD;AACnD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,mBAAmB;AACnB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAeD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAgC,GAAG,OAAO,CAAC,MAAM,CAAC,CAelH;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,GAAE,SAAS,MAAM,EAAO,GAAG,qBAAqB,CAmExI;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAEzF"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript facts for a work record (#1349).
|
|
3
|
+
*
|
|
4
|
+
* Reads a bounded tail of the doer's Claude Code transcript and keeps only
|
|
5
|
+
* what happened inside the task window: failed tool calls (with whether the
|
|
6
|
+
* same call later succeeded), files written, PR / commit references and
|
|
7
|
+
* messages posted. Only the main chain counts (`isSidechain` entries belong
|
|
8
|
+
* to subagents). Tool results are read for their error flag and the first
|
|
9
|
+
* line of an exit code, never copied.
|
|
10
|
+
*
|
|
11
|
+
* Codex rollouts are not read (their shape differs; the trace covers them).
|
|
12
|
+
*
|
|
13
|
+
* @module services/wiki/work-record-transcript
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'fs/promises';
|
|
16
|
+
import { WORK_RECORD_CONSTANTS } from '../../constants.js';
|
|
17
|
+
import { redactSensitive } from './wiki-redaction.js';
|
|
18
|
+
const C = WORK_RECORD_CONSTANTS;
|
|
19
|
+
const PR_URL_RE = /https:\/\/github\.com\/[\w.-]+\/[\w.-]+\/(?:pull|issues)\/\d+/g;
|
|
20
|
+
const COMMIT_LINE_RE = /^\[[^\]\s]+ (?:\(root-commit\) )?([0-9a-f]{7,12})\]/m;
|
|
21
|
+
const EXIT_CODE_RE = /^Exit code (\d+)/m;
|
|
22
|
+
const POST_SKILL_RE = /\b(?:reply-chat|reply-channel|reply|slack-post|send-chat-response|send-message|slack-file|whatsapp-send|gmail-send)\b/;
|
|
23
|
+
const FILE_TOOLS = new Set(['Write', 'Edit', 'MultiEdit', 'NotebookEdit']);
|
|
24
|
+
/**
|
|
25
|
+
* Read the end of a file as whole lines (the first partial line is dropped).
|
|
26
|
+
*
|
|
27
|
+
* @param file - Path
|
|
28
|
+
* @param maxBytes - Bytes from the end
|
|
29
|
+
* @returns Text, '' when the file cannot be read
|
|
30
|
+
*/
|
|
31
|
+
export async function readTranscriptTail(file, maxBytes = C.TRANSCRIPT_TAIL_BYTES) {
|
|
32
|
+
let handle = null;
|
|
33
|
+
try {
|
|
34
|
+
handle = await fs.open(file, 'r');
|
|
35
|
+
const { size } = await handle.stat();
|
|
36
|
+
const start = Math.max(0, size - maxBytes);
|
|
37
|
+
const buf = Buffer.alloc(size - start);
|
|
38
|
+
await handle.read(buf, 0, buf.length, start);
|
|
39
|
+
const text = buf.toString('utf-8');
|
|
40
|
+
return start > 0 ? text.slice(text.indexOf('\n') + 1) : text;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return '';
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
await handle?.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Facts from whole Claude transcript lines inside a window.
|
|
51
|
+
*
|
|
52
|
+
* @param text - JSONL text (whole lines)
|
|
53
|
+
* @param window - Task window (epoch ms); entries outside it are ignored
|
|
54
|
+
* @param roots - Project roots to make file paths relative to
|
|
55
|
+
* @returns Facts (empty when nothing fell in the window)
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const facts = parseClaudeTranscriptWindow(await readTranscriptTail(file), { fromMs, toMs }, [projectPath]);
|
|
60
|
+
* facts.errors; // [{ what: 'Bash `npm test` exit 1', resolved: 'fixed' }]
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export function parseClaudeTranscriptWindow(text, window, roots = []) {
|
|
64
|
+
const facts = { errors: [], filesWritten: [], urls: [], commits: [], posts: 0, toolCalls: 0 };
|
|
65
|
+
const uses = new Map();
|
|
66
|
+
const failed = [];
|
|
67
|
+
const succeededKeys = new Map();
|
|
68
|
+
const files = new Set();
|
|
69
|
+
const urls = new Set();
|
|
70
|
+
const commits = new Set();
|
|
71
|
+
const from = window.fromMs - C.TRANSCRIPT_WINDOW_SLACK_MS;
|
|
72
|
+
const to = window.toMs + C.TRANSCRIPT_WINDOW_SLACK_MS;
|
|
73
|
+
for (const line of text.split('\n')) {
|
|
74
|
+
if (line.length < 20 || !(line.includes('"tool_use"') || line.includes('"tool_result"') || line.includes('"type":"text"')))
|
|
75
|
+
continue;
|
|
76
|
+
let entry;
|
|
77
|
+
try {
|
|
78
|
+
entry = JSON.parse(line);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (entry.isSidechain === true || entry.isMeta === true || entry.isApiErrorMessage === true)
|
|
84
|
+
continue;
|
|
85
|
+
const at = Date.parse(typeof entry.timestamp === 'string' ? entry.timestamp : '');
|
|
86
|
+
if (!Number.isFinite(at) || at < from || at > to)
|
|
87
|
+
continue;
|
|
88
|
+
const content = entry.message?.content;
|
|
89
|
+
if (!Array.isArray(content))
|
|
90
|
+
continue;
|
|
91
|
+
for (const block of content) {
|
|
92
|
+
if (block?.type === 'tool_use' && typeof block.id === 'string' && typeof block.name === 'string') {
|
|
93
|
+
const use = describeToolUse(block.name, block.input, roots, at);
|
|
94
|
+
uses.set(block.id, use);
|
|
95
|
+
facts.toolCalls++;
|
|
96
|
+
if (FILE_TOOLS.has(block.name)) {
|
|
97
|
+
const p = filePathOf(block.input);
|
|
98
|
+
if (p)
|
|
99
|
+
files.add(relative(p, roots));
|
|
100
|
+
}
|
|
101
|
+
if (block.name === 'Bash' && POST_SKILL_RE.test(commandOf(block.input)))
|
|
102
|
+
facts.posts++;
|
|
103
|
+
}
|
|
104
|
+
else if (block?.type === 'tool_result' && typeof block.tool_use_id === 'string') {
|
|
105
|
+
const use = uses.get(block.tool_use_id);
|
|
106
|
+
const resultText = resultTextOf(block.content);
|
|
107
|
+
const exit = resultText.match(EXIT_CODE_RE);
|
|
108
|
+
const nonZeroExit = exit ? Number(exit[1]) !== 0 : false;
|
|
109
|
+
if (block.is_error === true || nonZeroExit) {
|
|
110
|
+
if (use)
|
|
111
|
+
failed.push({ use: exit && nonZeroExit ? { ...use, summary: `${use.summary} exit ${exit[1]}` } : use, at });
|
|
112
|
+
}
|
|
113
|
+
else if (use) {
|
|
114
|
+
succeededKeys.set(use.key, at);
|
|
115
|
+
}
|
|
116
|
+
for (const u of resultText.match(PR_URL_RE) ?? [])
|
|
117
|
+
urls.add(u);
|
|
118
|
+
const commit = resultText.match(COMMIT_LINE_RE);
|
|
119
|
+
if (commit && use?.name === 'Bash' && /\bgit\s+commit\b/.test(use.summary))
|
|
120
|
+
commits.add(commit[1]);
|
|
121
|
+
}
|
|
122
|
+
else if (block?.type === 'text' && typeof block.text === 'string' && entry.type === 'assistant') {
|
|
123
|
+
for (const u of block.text.match(PR_URL_RE) ?? [])
|
|
124
|
+
urls.add(u);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const seen = new Set();
|
|
129
|
+
for (const f of failed) {
|
|
130
|
+
const what = redactSensitive(f.use.summary);
|
|
131
|
+
if (seen.has(what))
|
|
132
|
+
continue;
|
|
133
|
+
seen.add(what);
|
|
134
|
+
const later = succeededKeys.get(f.use.key);
|
|
135
|
+
facts.errors.push({ what, resolved: later !== undefined && later > f.at ? 'fixed' : 'unresolved' });
|
|
136
|
+
if (facts.errors.length >= C.MAX_ERRORS)
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
facts.filesWritten = [...files].slice(0, C.MAX_OUTPUTS);
|
|
140
|
+
facts.urls = [...urls].slice(0, C.MAX_OUTPUTS);
|
|
141
|
+
facts.commits = [...commits].slice(0, C.MAX_OUTPUTS);
|
|
142
|
+
return facts;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Whether a transcript is worth reading for an item that ended at `endedMs`:
|
|
146
|
+
* the tail only holds recent turns.
|
|
147
|
+
*
|
|
148
|
+
* @param endedMs - When the item ended (epoch ms)
|
|
149
|
+
* @param now - Clock
|
|
150
|
+
* @returns True when the window may still be in the tail
|
|
151
|
+
*/
|
|
152
|
+
export function transcriptWorthReading(endedMs, now = Date.now()) {
|
|
153
|
+
return Number.isFinite(endedMs) && now - endedMs <= C.TRANSCRIPT_MAX_AGE_MS;
|
|
154
|
+
}
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
function describeToolUse(name, input, roots, at) {
|
|
157
|
+
if (name === 'Bash') {
|
|
158
|
+
const command = commandOf(input).replace(/\s+/g, ' ').trim();
|
|
159
|
+
const shown = command.length > 80 ? `${command.slice(0, 79)}…` : command;
|
|
160
|
+
return { name, summary: `Bash \`${shown}\``, key: `Bash:${command.slice(0, 200)}`, at };
|
|
161
|
+
}
|
|
162
|
+
const p = filePathOf(input);
|
|
163
|
+
if (p)
|
|
164
|
+
return { name, summary: `${name} ${relative(p, roots)}`, key: `${name}:${p}`, at };
|
|
165
|
+
return { name, summary: `${name} call`, key: `${name}:`, at };
|
|
166
|
+
}
|
|
167
|
+
function commandOf(input) {
|
|
168
|
+
const c = input?.command;
|
|
169
|
+
return typeof c === 'string' ? c : '';
|
|
170
|
+
}
|
|
171
|
+
function filePathOf(input) {
|
|
172
|
+
const p = input;
|
|
173
|
+
const v = p?.file_path ?? p?.notebook_path ?? p?.path;
|
|
174
|
+
return typeof v === 'string' && v.length > 0 ? v : null;
|
|
175
|
+
}
|
|
176
|
+
function relative(file, roots) {
|
|
177
|
+
for (const root of roots) {
|
|
178
|
+
if (root && file.startsWith(`${root}/`))
|
|
179
|
+
return file.slice(root.length + 1);
|
|
180
|
+
}
|
|
181
|
+
return file;
|
|
182
|
+
}
|
|
183
|
+
function resultTextOf(content) {
|
|
184
|
+
if (typeof content === 'string')
|
|
185
|
+
return content.slice(0, 4_000);
|
|
186
|
+
if (Array.isArray(content)) {
|
|
187
|
+
return content
|
|
188
|
+
.map((c) => (typeof c?.text === 'string' ? (c.text) : ''))
|
|
189
|
+
.join('\n')
|
|
190
|
+
.slice(0, 4_000);
|
|
191
|
+
}
|
|
192
|
+
return '';
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=work-record-transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-record-transcript.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/work-record-transcript.ts"],"names":[],"mappings":"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"}
|