crewly 1.20.418 → 1.20.420
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/skills/agent/core/record-learning/SKILL.md +12 -1
- package/config/skills/agent/core/record-learning/execute.sh +24 -2
- package/config/skills/team-leader/decide-correction/SKILL.md +65 -0
- package/config/skills/team-leader/decide-correction/execute.sh +63 -0
- package/config/skills/team-leader/handle-failure/SKILL.md +2 -0
- package/config/skills/team-leader/handle-failure/execute.sh +18 -0
- package/dist/backend/backend/src/constants.d.ts +38 -3
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +38 -3
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/memory/memory.controller.d.ts +42 -2
- package/dist/backend/backend/src/controllers/memory/memory.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/memory/memory.controller.js +111 -4
- package/dist/backend/backend/src/controllers/memory/memory.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/memory/memory.routes.d.ts +3 -0
- package/dist/backend/backend/src/controllers/memory/memory.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/memory/memory.routes.js +7 -1
- package/dist/backend/backend/src/controllers/memory/memory.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team-export.controller.d.ts +3 -2
- package/dist/backend/backend/src/controllers/team/team-export.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team-export.controller.js +5 -3
- package/dist/backend/backend/src/controllers/team/team-export.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +25 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/core/team-export.service.d.ts +58 -2
- package/dist/backend/backend/src/services/core/team-export.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/team-export.service.js +88 -3
- package/dist/backend/backend/src/services/core/team-export.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/correction-ladder.service.d.ts +225 -0
- package/dist/backend/backend/src/services/memory/correction-ladder.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/correction-ladder.service.js +335 -0
- package/dist/backend/backend/src/services/memory/correction-ladder.service.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +38 -3
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +38 -3
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/cli/src/commands/team-export.d.ts +18 -1
- package/dist/cli/cli/src/commands/team-export.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/team-export.js +25 -3
- package/dist/cli/cli/src/commands/team-export.js.map +1 -1
- package/dist/cli/cli/src/index.js +1 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/frontend/dist/assets/{index-b5c4b66c.js → index-d15d21a9.js} +112 -112
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -14,7 +14,12 @@
|
|
|
14
14
|
* before it is returned;
|
|
15
15
|
* - the connectors the team's prompts, skills and schedules refer to are
|
|
16
16
|
* listed under `portability.connectors` so the importer knows what to
|
|
17
|
-
* reconnect — grants themselves never travel
|
|
17
|
+
* reconnect — grants themselves never travel;
|
|
18
|
+
* - the team's wiki vault (its knowledge: decisions, patterns, SOPs, digests)
|
|
19
|
+
* travels only when asked for (`includeWiki`), as `.md` pages; the package
|
|
20
|
+
* always says how much knowledge the team has and whether it is inside
|
|
21
|
+
* (`portability.knowledge`), so nobody imports a team thinking it brought
|
|
22
|
+
* its memory when it did not.
|
|
18
23
|
*
|
|
19
24
|
* @module services/core/team-export.service
|
|
20
25
|
*/
|
|
@@ -22,6 +27,17 @@ import type { Team } from '../../types/index.js';
|
|
|
22
27
|
import type { CronTask } from '../../types/cron-task.types.js';
|
|
23
28
|
import type { StorageService } from './storage.service.js';
|
|
24
29
|
import type { SecretEnvValue } from '../../utils/secret-env.js';
|
|
30
|
+
/** The team's wiki vault as seen by the export: how much there is and whether it travelled. */
|
|
31
|
+
export interface TeamExportKnowledge {
|
|
32
|
+
/** Whether the pages are in the package (`wiki`) */
|
|
33
|
+
included: boolean;
|
|
34
|
+
/** Wiki pages (`.md`) found in the vault */
|
|
35
|
+
pages: number;
|
|
36
|
+
/** Their size in bytes */
|
|
37
|
+
bytes: number;
|
|
38
|
+
/** Pages found but left out: over the per-page cap, or past the total cap */
|
|
39
|
+
skipped: string[];
|
|
40
|
+
}
|
|
25
41
|
/** What makes a package portable: what was stripped, masked and must be reconnected. */
|
|
26
42
|
export interface TeamExportPortability {
|
|
27
43
|
/** Secrets masked across the package */
|
|
@@ -32,6 +48,8 @@ export interface TeamExportPortability {
|
|
|
32
48
|
connectors: string[];
|
|
33
49
|
/** Member fields removed because they describe the running agent, not the team */
|
|
34
50
|
strippedFields: string[];
|
|
51
|
+
/** The team's knowledge: how much, and whether it is in the package (1.2+) */
|
|
52
|
+
knowledge?: TeamExportKnowledge;
|
|
35
53
|
}
|
|
36
54
|
/**
|
|
37
55
|
* Complete team export bundle containing all team data.
|
|
@@ -40,7 +58,7 @@ export interface TeamExportPortability {
|
|
|
40
58
|
*/
|
|
41
59
|
export interface TeamExport {
|
|
42
60
|
/** Format version for forward compatibility */
|
|
43
|
-
version: '1.0' | '1.1';
|
|
61
|
+
version: '1.0' | '1.1' | '1.2';
|
|
44
62
|
/** ISO timestamp when the export was created */
|
|
45
63
|
exportedAt: string;
|
|
46
64
|
/** Team configuration (config.json content), runtime state stripped */
|
|
@@ -51,6 +69,8 @@ export interface TeamExport {
|
|
|
51
69
|
norms: Record<string, string>;
|
|
52
70
|
/** Team-scoped cron tasks */
|
|
53
71
|
cronTasks: CronTask[];
|
|
72
|
+
/** Wiki pages, vault-relative path → markdown (1.2+, only with `includeWiki`) */
|
|
73
|
+
wiki?: Record<string, string>;
|
|
54
74
|
/** What was stripped, masked and must be reconnected (1.1+) */
|
|
55
75
|
portability?: TeamExportPortability;
|
|
56
76
|
}
|
|
@@ -68,11 +88,24 @@ export interface TeamImportResult {
|
|
|
68
88
|
cronTasksImported: number;
|
|
69
89
|
/** Connectors the package says the team uses; reconnect them on this install */
|
|
70
90
|
connectorsToReconnect: string[];
|
|
91
|
+
/** Wiki pages written into the new team's vault */
|
|
92
|
+
wikiPagesImported: number;
|
|
93
|
+
/** Wiki pages the package carried but this install refused (bad path) */
|
|
94
|
+
wikiPagesRejected: string[];
|
|
71
95
|
}
|
|
72
96
|
/** Options of {@link TeamExportService.exportTeam}. */
|
|
73
97
|
export interface TeamExportOptions {
|
|
74
98
|
/** Exact secret values to mask wherever they appear (see collectSecretEnvValues) */
|
|
75
99
|
knownSecrets?: readonly SecretEnvValue[];
|
|
100
|
+
/** Put the team's wiki pages in the package (default: count them only) */
|
|
101
|
+
includeWiki?: boolean;
|
|
102
|
+
}
|
|
103
|
+
/** A team's wiki vault as read for a package. */
|
|
104
|
+
export interface CollectedWiki {
|
|
105
|
+
/** Pages that fit, vault-relative path → content */
|
|
106
|
+
pages: Record<string, string>;
|
|
107
|
+
/** What the vault holds, packaged or not */
|
|
108
|
+
knowledge: TeamExportKnowledge;
|
|
76
109
|
}
|
|
77
110
|
/**
|
|
78
111
|
* A copy of a team without this install's runtime state: every member is
|
|
@@ -110,6 +143,26 @@ export declare function redactDeep<T>(value: T, knownSecrets?: readonly SecretEn
|
|
|
110
143
|
* @returns Connector ids, sorted
|
|
111
144
|
*/
|
|
112
145
|
export declare function referencedConnectors(team: Team, prompts: Record<string, string>, norms: Record<string, string>, cronTasks: CronTask[]): string[];
|
|
146
|
+
/**
|
|
147
|
+
* Whether a vault-relative path may travel in, or be written from, a package:
|
|
148
|
+
* a `.md` file, no absolute or dot segments, no traversal. Ledgers
|
|
149
|
+
* (`usage.jsonl`), compile state and anything hidden never match.
|
|
150
|
+
*
|
|
151
|
+
* @param relativePath - Vault-relative path as the package names it
|
|
152
|
+
* @returns True when the path is a plain wiki page path
|
|
153
|
+
*/
|
|
154
|
+
export declare function isPackagedWikiPath(relativePath: string): boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Read a team's wiki vault for a package: every `.md` page with its size,
|
|
157
|
+
* packaged while it fits under the per-page and total caps (the rest is
|
|
158
|
+
* listed as skipped so the owner sees what stayed behind). With
|
|
159
|
+
* `include = false` the pages are only counted.
|
|
160
|
+
*
|
|
161
|
+
* @param vaultDir - `<team dir>/wiki`
|
|
162
|
+
* @param include - Whether to return the page contents
|
|
163
|
+
* @returns Pages (empty when not included) and the knowledge summary
|
|
164
|
+
*/
|
|
165
|
+
export declare function collectTeamWiki(vaultDir: string, include: boolean): Promise<CollectedWiki>;
|
|
113
166
|
/**
|
|
114
167
|
* Whether a package version can be imported.
|
|
115
168
|
*
|
|
@@ -156,6 +209,9 @@ export declare class TeamExportService {
|
|
|
156
209
|
* - Prompts written to teams/{teamId}/prompts/
|
|
157
210
|
* - Norms written to teams/{teamId}/norms/
|
|
158
211
|
* - Cron tasks with NEW IDs to teams/{teamId}/cron-tasks.json
|
|
212
|
+
* - Wiki pages (1.2 packages exported with the wiki) to teams/{teamId}/wiki/,
|
|
213
|
+
* each path checked against {@link isPackagedWikiPath} first; the index
|
|
214
|
+
* page travels with them, so no rebuild is needed
|
|
159
215
|
*
|
|
160
216
|
* @param data - The team export bundle to import
|
|
161
217
|
* @returns Import result with counts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-export.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/core/team-export.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"team-export.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/core/team-export.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,12 @@
|
|
|
14
14
|
* before it is returned;
|
|
15
15
|
* - the connectors the team's prompts, skills and schedules refer to are
|
|
16
16
|
* listed under `portability.connectors` so the importer knows what to
|
|
17
|
-
* reconnect — grants themselves never travel
|
|
17
|
+
* reconnect — grants themselves never travel;
|
|
18
|
+
* - the team's wiki vault (its knowledge: decisions, patterns, SOPs, digests)
|
|
19
|
+
* travels only when asked for (`includeWiki`), as `.md` pages; the package
|
|
20
|
+
* always says how much knowledge the team has and whether it is inside
|
|
21
|
+
* (`portability.knowledge`), so nobody imports a team thinking it brought
|
|
22
|
+
* its memory when it did not.
|
|
18
23
|
*
|
|
19
24
|
* @module services/core/team-export.service
|
|
20
25
|
*/
|
|
@@ -104,6 +109,63 @@ export function referencedConnectors(team, prompts, norms, cronTasks) {
|
|
|
104
109
|
.map(([id]) => id)
|
|
105
110
|
.sort();
|
|
106
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Whether a vault-relative path may travel in, or be written from, a package:
|
|
114
|
+
* a `.md` file, no absolute or dot segments, no traversal. Ledgers
|
|
115
|
+
* (`usage.jsonl`), compile state and anything hidden never match.
|
|
116
|
+
*
|
|
117
|
+
* @param relativePath - Vault-relative path as the package names it
|
|
118
|
+
* @returns True when the path is a plain wiki page path
|
|
119
|
+
*/
|
|
120
|
+
export function isPackagedWikiPath(relativePath) {
|
|
121
|
+
return (TEAM_EXPORT_CONSTANTS.WIKI_PAGE_PATH_PATTERN.test(relativePath) &&
|
|
122
|
+
!relativePath.split('/').some((segment) => segment === '..' || segment.startsWith('.')));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Read a team's wiki vault for a package: every `.md` page with its size,
|
|
126
|
+
* packaged while it fits under the per-page and total caps (the rest is
|
|
127
|
+
* listed as skipped so the owner sees what stayed behind). With
|
|
128
|
+
* `include = false` the pages are only counted.
|
|
129
|
+
*
|
|
130
|
+
* @param vaultDir - `<team dir>/wiki`
|
|
131
|
+
* @param include - Whether to return the page contents
|
|
132
|
+
* @returns Pages (empty when not included) and the knowledge summary
|
|
133
|
+
*/
|
|
134
|
+
export async function collectTeamWiki(vaultDir, include) {
|
|
135
|
+
const knowledge = { included: include, pages: 0, bytes: 0, skipped: [] };
|
|
136
|
+
const pages = {};
|
|
137
|
+
if (!existsSync(vaultDir))
|
|
138
|
+
return { pages, knowledge };
|
|
139
|
+
let entries;
|
|
140
|
+
try {
|
|
141
|
+
entries = (await fs.readdir(vaultDir, { recursive: true })).map((e) => String(e).split(path.sep).join('/'));
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return { pages, knowledge };
|
|
145
|
+
}
|
|
146
|
+
let packagedBytes = 0;
|
|
147
|
+
for (const rel of entries.filter(isPackagedWikiPath).sort()) {
|
|
148
|
+
let content;
|
|
149
|
+
try {
|
|
150
|
+
content = await fs.readFile(path.join(vaultDir, ...rel.split('/')), 'utf8');
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
continue; // a directory named like a page, or unreadable — not knowledge we can carry
|
|
154
|
+
}
|
|
155
|
+
const bytes = Buffer.byteLength(content, 'utf8');
|
|
156
|
+
knowledge.pages += 1;
|
|
157
|
+
knowledge.bytes += bytes;
|
|
158
|
+
if (!include)
|
|
159
|
+
continue;
|
|
160
|
+
if (bytes > TEAM_EXPORT_CONSTANTS.WIKI_MAX_PAGE_BYTES || packagedBytes + bytes > TEAM_EXPORT_CONSTANTS.WIKI_MAX_TOTAL_BYTES) {
|
|
161
|
+
knowledge.skipped.push(rel);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
pages[rel] = content;
|
|
165
|
+
packagedBytes += bytes;
|
|
166
|
+
}
|
|
167
|
+
return { pages, knowledge };
|
|
168
|
+
}
|
|
107
169
|
/**
|
|
108
170
|
* Whether a package version can be imported.
|
|
109
171
|
*
|
|
@@ -187,10 +249,12 @@ export class TeamExportService {
|
|
|
187
249
|
}
|
|
188
250
|
// Read cron tasks
|
|
189
251
|
const cronTasks = await this.readCronTasks(teamDir);
|
|
252
|
+
// The wiki vault: counted always, packaged on request.
|
|
253
|
+
const wiki = await collectTeamWiki(path.join(teamDir, TEAM_EXPORT_CONSTANTS.WIKI_DIR), options.includeWiki === true);
|
|
190
254
|
const { team, strippedFields } = stripRuntimeState(stored);
|
|
191
255
|
const connectors = referencedConnectors(team, prompts, norms, cronTasks);
|
|
192
|
-
const masked = redactDeep({ team, prompts, norms, cronTasks }, options.knownSecrets);
|
|
193
|
-
const portability = { redactions: masked.count, scanClean: true, connectors, strippedFields };
|
|
256
|
+
const masked = redactDeep({ team, prompts, norms, cronTasks, ...(options.includeWiki ? { wiki: wiki.pages } : {}) }, options.knownSecrets);
|
|
257
|
+
const portability = { redactions: masked.count, scanClean: true, connectors, strippedFields, knowledge: wiki.knowledge };
|
|
194
258
|
const bundle = {
|
|
195
259
|
version: TEAM_EXPORT_CONSTANTS.VERSION,
|
|
196
260
|
exportedAt: new Date().toISOString(),
|
|
@@ -211,6 +275,9 @@ export class TeamExportService {
|
|
|
211
275
|
* - Prompts written to teams/{teamId}/prompts/
|
|
212
276
|
* - Norms written to teams/{teamId}/norms/
|
|
213
277
|
* - Cron tasks with NEW IDs to teams/{teamId}/cron-tasks.json
|
|
278
|
+
* - Wiki pages (1.2 packages exported with the wiki) to teams/{teamId}/wiki/,
|
|
279
|
+
* each path checked against {@link isPackagedWikiPath} first; the index
|
|
280
|
+
* page travels with them, so no rebuild is needed
|
|
214
281
|
*
|
|
215
282
|
* @param data - The team export bundle to import
|
|
216
283
|
* @returns Import result with counts
|
|
@@ -258,6 +325,22 @@ export class TeamExportService {
|
|
|
258
325
|
await fs.writeFile(cronPath, JSON.stringify(cronStore, null, 2), 'utf8');
|
|
259
326
|
cronTasksImported = remapped.length;
|
|
260
327
|
}
|
|
328
|
+
// Write wiki pages (only paths a package is allowed to name)
|
|
329
|
+
let wikiPagesImported = 0;
|
|
330
|
+
const wikiPagesRejected = [];
|
|
331
|
+
if (data.wiki && typeof data.wiki === 'object') {
|
|
332
|
+
const vaultDir = path.join(teamDir, TEAM_EXPORT_CONSTANTS.WIKI_DIR);
|
|
333
|
+
for (const [rel, content] of Object.entries(data.wiki)) {
|
|
334
|
+
if (!isPackagedWikiPath(rel) || typeof content !== 'string') {
|
|
335
|
+
wikiPagesRejected.push(rel);
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
const target = path.join(vaultDir, ...rel.split('/'));
|
|
339
|
+
mkdirSync(path.dirname(target), { recursive: true });
|
|
340
|
+
await fs.writeFile(target, content, 'utf8');
|
|
341
|
+
wikiPagesImported++;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
261
344
|
const connectorsToReconnect = data.portability?.connectors ?? referencedConnectors(team, data.prompts ?? {}, data.norms ?? {}, data.cronTasks ?? []);
|
|
262
345
|
return {
|
|
263
346
|
team,
|
|
@@ -265,6 +348,8 @@ export class TeamExportService {
|
|
|
265
348
|
normsImported,
|
|
266
349
|
cronTasksImported,
|
|
267
350
|
connectorsToReconnect,
|
|
351
|
+
wikiPagesImported,
|
|
352
|
+
wikiPagesRejected,
|
|
268
353
|
};
|
|
269
354
|
}
|
|
270
355
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-export.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/core/team-export.service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"team-export.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/core/team-export.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Correction ladder (#810, specs/2026-10-25-correction-ladder.md).
|
|
3
|
+
*
|
|
4
|
+
* When an agent is corrected, the correction lands in memory, an SOP or a
|
|
5
|
+
* prompt: prose that is read every turn and still lets the same mistake
|
|
6
|
+
* back in. This service keeps a per-project tally of corrections by
|
|
7
|
+
* **class** (a short slug the recorder chooses, e.g. `git-add-all`) and,
|
|
8
|
+
* the second time a class is recorded, hands the project's team lead one
|
|
9
|
+
* WorkItem: "can this be made impossible or checked in code?" with the
|
|
10
|
+
* ladder as options —
|
|
11
|
+
*
|
|
12
|
+
* (a) structural / API change — the mistake can no longer be expressed
|
|
13
|
+
* (b) lint / test / CI check — it is caught before merge
|
|
14
|
+
* (c) state-triggered hook — it is caught when it happens
|
|
15
|
+
* (d) keep as prose, with a stated reason
|
|
16
|
+
*
|
|
17
|
+
* The WorkItem is deduplicated: one open item per class. The lead records
|
|
18
|
+
* the rung with `decide`; until then a third occurrence does not raise a
|
|
19
|
+
* second item. A decision of (d) is not final: when the prose did not
|
|
20
|
+
* stick (two more occurrences after it), the class is raised again. No LLM;
|
|
21
|
+
* a plain JSON store under the project's `.crewly/`.
|
|
22
|
+
*
|
|
23
|
+
* @module services/memory/correction-ladder.service
|
|
24
|
+
*/
|
|
25
|
+
import { CORRECTION_LADDER_CONSTANTS } from '../../constants.js';
|
|
26
|
+
import { type WorkItem } from '../../types/v2/work-item.types.js';
|
|
27
|
+
/** Where a correction came from. */
|
|
28
|
+
export type CorrectionSource = 'learning' | 'failure' | 'manual';
|
|
29
|
+
/** The rungs of the ladder, from "cannot happen" to "we tell them again". */
|
|
30
|
+
export type CorrectionRung = (typeof CORRECTION_LADDER_CONSTANTS.RUNGS)[number];
|
|
31
|
+
/** One time a class was recorded. */
|
|
32
|
+
export interface CorrectionOccurrence {
|
|
33
|
+
/** ISO timestamp */
|
|
34
|
+
at: string;
|
|
35
|
+
/** Who recorded it (session name or agent id) */
|
|
36
|
+
agentId: string;
|
|
37
|
+
/** Learning, TL failure handling, or a direct call */
|
|
38
|
+
source: CorrectionSource;
|
|
39
|
+
/** The correction text as recorded (trimmed to `OCCURRENCE_TEXT_MAX_CHARS`) */
|
|
40
|
+
text: string;
|
|
41
|
+
/** Ticket / WorkItem the correction came from */
|
|
42
|
+
relatedTask?: string;
|
|
43
|
+
}
|
|
44
|
+
/** The lead's answer for a class. */
|
|
45
|
+
export interface CorrectionDecision {
|
|
46
|
+
rung: CorrectionRung;
|
|
47
|
+
/** Why this rung — required for every rung, and the whole point of (d) */
|
|
48
|
+
reason: string;
|
|
49
|
+
/** PR, file, rule or hook that implements it */
|
|
50
|
+
link?: string;
|
|
51
|
+
decidedBy: string;
|
|
52
|
+
decidedAt: string;
|
|
53
|
+
}
|
|
54
|
+
/** Everything known about one correction class in one project. */
|
|
55
|
+
export interface CorrectionClassRecord {
|
|
56
|
+
class: string;
|
|
57
|
+
/** Times recorded, all time */
|
|
58
|
+
count: number;
|
|
59
|
+
firstAt: string;
|
|
60
|
+
lastAt: string;
|
|
61
|
+
/** Newest last; capped at `MAX_OCCURRENCES_KEPT` */
|
|
62
|
+
occurrences: CorrectionOccurrence[];
|
|
63
|
+
/** The open ladder WorkItem, if one was raised and not yet decided */
|
|
64
|
+
workItemId: string | null;
|
|
65
|
+
workItemAt: string | null;
|
|
66
|
+
/** The current decision; `null` while undecided or after a re-raise */
|
|
67
|
+
decision: CorrectionDecision | null;
|
|
68
|
+
/** Earlier decisions that did not hold (a (d) that was raised again) */
|
|
69
|
+
previousDecisions: CorrectionDecision[];
|
|
70
|
+
}
|
|
71
|
+
/** The per-project store. */
|
|
72
|
+
export interface CorrectionLadderStore {
|
|
73
|
+
version: 1;
|
|
74
|
+
classes: Record<string, CorrectionClassRecord>;
|
|
75
|
+
}
|
|
76
|
+
/** Input of {@link CorrectionLadderService.record}. */
|
|
77
|
+
export interface RecordCorrectionInput {
|
|
78
|
+
projectPath: string;
|
|
79
|
+
/** Free text; normalised with {@link normalizeCorrectionClass} */
|
|
80
|
+
correctionClass: string;
|
|
81
|
+
agentId: string;
|
|
82
|
+
text: string;
|
|
83
|
+
source: CorrectionSource;
|
|
84
|
+
relatedTask?: string;
|
|
85
|
+
}
|
|
86
|
+
/** Why a second occurrence did not raise a WorkItem. */
|
|
87
|
+
export type CorrectionRaiseSkip = 'below_threshold' | 'already_raised' | 'decided' | 'no_pool' | 'target_dormant';
|
|
88
|
+
/** Result of {@link CorrectionLadderService.record}. */
|
|
89
|
+
export interface RecordCorrectionResult {
|
|
90
|
+
record: CorrectionClassRecord;
|
|
91
|
+
/** Whether this call raised the lead's WorkItem */
|
|
92
|
+
raised: boolean;
|
|
93
|
+
workItemId?: string;
|
|
94
|
+
target?: string;
|
|
95
|
+
skipped?: CorrectionRaiseSkip;
|
|
96
|
+
}
|
|
97
|
+
/** Input of {@link CorrectionLadderService.decide}. */
|
|
98
|
+
export interface DecideCorrectionInput {
|
|
99
|
+
projectPath: string;
|
|
100
|
+
correctionClass: string;
|
|
101
|
+
rung: string;
|
|
102
|
+
reason: string;
|
|
103
|
+
link?: string;
|
|
104
|
+
decidedBy: string;
|
|
105
|
+
}
|
|
106
|
+
/** The pool slice this service needs. */
|
|
107
|
+
export interface CorrectionLadderPool {
|
|
108
|
+
addToPool(workItem: WorkItem): Promise<void>;
|
|
109
|
+
}
|
|
110
|
+
/** Wiring. */
|
|
111
|
+
export interface CorrectionLadderOptions {
|
|
112
|
+
pool?: CorrectionLadderPool;
|
|
113
|
+
/** The team-lead session for a project root; `null` falls back to the orchestrator */
|
|
114
|
+
resolveTarget?: (projectPath: string) => Promise<string | null>;
|
|
115
|
+
/** Whether a session is awake; a dormant lead is not woken for a chore */
|
|
116
|
+
isTargetAwake?: (sessionName: string) => Promise<boolean>;
|
|
117
|
+
/** Target when no lead resolves (default: the orchestrator) */
|
|
118
|
+
fallbackTarget?: string;
|
|
119
|
+
/** Clock (tests) */
|
|
120
|
+
now?: () => number;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Normalise a class to a slug: lower case, `a-z0-9-`, no leading/trailing
|
|
124
|
+
* or doubled dashes, at most `CLASS_MAX_CHARS`. Returns `null` when nothing
|
|
125
|
+
* usable is left.
|
|
126
|
+
*
|
|
127
|
+
* @param raw - What the recorder typed
|
|
128
|
+
* @returns The slug, or null
|
|
129
|
+
*/
|
|
130
|
+
export declare function normalizeCorrectionClass(raw: unknown): string | null;
|
|
131
|
+
/**
|
|
132
|
+
* Whether a string names a rung of the ladder.
|
|
133
|
+
*
|
|
134
|
+
* @param rung - Candidate
|
|
135
|
+
* @returns True for one of `RUNGS`
|
|
136
|
+
*/
|
|
137
|
+
export declare function isCorrectionRung(rung: unknown): rung is CorrectionRung;
|
|
138
|
+
/**
|
|
139
|
+
* Where a project's ladder store lives.
|
|
140
|
+
*
|
|
141
|
+
* @param projectPath - Project root
|
|
142
|
+
* @returns `<project data dir>/correction-ladder.json`
|
|
143
|
+
*/
|
|
144
|
+
export declare function correctionLadderPath(projectPath: string): string;
|
|
145
|
+
/**
|
|
146
|
+
* Occurrences recorded after the current decision (or all, when undecided).
|
|
147
|
+
*
|
|
148
|
+
* @param record - Class record
|
|
149
|
+
* @returns Count
|
|
150
|
+
*/
|
|
151
|
+
export declare function occurrencesSinceDecision(record: CorrectionClassRecord): number;
|
|
152
|
+
/**
|
|
153
|
+
* The lead's WorkItem for a class: the tally, the recorded texts, the four
|
|
154
|
+
* rungs, and how to record the choice.
|
|
155
|
+
*
|
|
156
|
+
* @param record - Class record (after the occurrence that raised it)
|
|
157
|
+
* @param projectPath - Project root
|
|
158
|
+
* @param target - Lead (or orchestrator) session
|
|
159
|
+
* @param again - Whether an earlier (d) did not hold
|
|
160
|
+
* @returns The WorkItem to add to the pool
|
|
161
|
+
*/
|
|
162
|
+
export declare function buildCorrectionWorkItem(record: CorrectionClassRecord, projectPath: string, target: string, again: boolean): WorkItem;
|
|
163
|
+
/**
|
|
164
|
+
* Per-project tally of correction classes with one ladder WorkItem per
|
|
165
|
+
* class for the team lead.
|
|
166
|
+
*/
|
|
167
|
+
export declare class CorrectionLadderService {
|
|
168
|
+
private static instance;
|
|
169
|
+
private readonly logger;
|
|
170
|
+
private readonly pool?;
|
|
171
|
+
private readonly resolveTarget?;
|
|
172
|
+
private readonly isTargetAwake?;
|
|
173
|
+
private readonly fallbackTarget;
|
|
174
|
+
private readonly now;
|
|
175
|
+
/** Serialises writes per store file */
|
|
176
|
+
private readonly locks;
|
|
177
|
+
/**
|
|
178
|
+
* @param options - Wiring (pool, lead resolver, wake check)
|
|
179
|
+
*/
|
|
180
|
+
constructor(options?: CorrectionLadderOptions);
|
|
181
|
+
/** The wired instance (an unwired one records and never raises). */
|
|
182
|
+
static getInstance(): CorrectionLadderService;
|
|
183
|
+
/** Install the wired instance (boot) or reset (tests). */
|
|
184
|
+
static setInstance(instance: CorrectionLadderService | null): void;
|
|
185
|
+
/**
|
|
186
|
+
* Record one correction of a class and, on the second occurrence (or the
|
|
187
|
+
* second after a (d) that did not hold), raise the lead's WorkItem.
|
|
188
|
+
*
|
|
189
|
+
* @param input - Class, who, what, where
|
|
190
|
+
* @returns The class record and whether a WorkItem was raised
|
|
191
|
+
* @throws Error when the class normalises to nothing or the text is empty
|
|
192
|
+
*/
|
|
193
|
+
record(input: RecordCorrectionInput): Promise<RecordCorrectionResult>;
|
|
194
|
+
/**
|
|
195
|
+
* Record the lead's choice for a class and close the ladder for it.
|
|
196
|
+
*
|
|
197
|
+
* @param input - Class, rung, reason, who
|
|
198
|
+
* @returns The updated record
|
|
199
|
+
* @throws Error for an unknown class, an unknown rung or an empty reason
|
|
200
|
+
*/
|
|
201
|
+
decide(input: DecideCorrectionInput): Promise<CorrectionClassRecord>;
|
|
202
|
+
/**
|
|
203
|
+
* Every class of a project, most recorded first.
|
|
204
|
+
*
|
|
205
|
+
* @param projectPath - Project root
|
|
206
|
+
* @returns Records
|
|
207
|
+
*/
|
|
208
|
+
list(projectPath: string): Promise<CorrectionClassRecord[]>;
|
|
209
|
+
/**
|
|
210
|
+
* Raise the lead's WorkItem when the class has earned it: `THRESHOLD`
|
|
211
|
+
* occurrences with no decision and no open item, or `THRESHOLD`
|
|
212
|
+
* occurrences after a (d) decision. An open item older than
|
|
213
|
+
* `REOPEN_AFTER_MS` with no decision counts as abandoned and is replaced.
|
|
214
|
+
*/
|
|
215
|
+
private maybeRaise;
|
|
216
|
+
/** The lead for a project; errors count as "no lead". */
|
|
217
|
+
private targetFor;
|
|
218
|
+
/** Errors count as dormant: a chore is never worth risking a wake. */
|
|
219
|
+
private targetAwake;
|
|
220
|
+
private read;
|
|
221
|
+
private write;
|
|
222
|
+
/** Run `fn` after every earlier operation on the same project's store. */
|
|
223
|
+
private withLock;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=correction-ladder.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correction-ladder.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/correction-ladder.service.ts"],"names":[],"mappings":"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"}
|