@hongmaple0820/scale-engine 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.en.md +310 -237
  2. package/README.md +255 -63
  3. package/dist/api/cli.js +2656 -1258
  4. package/dist/api/cli.js.map +1 -1
  5. package/dist/api/doctor.d.ts +4 -1
  6. package/dist/api/doctor.js +85 -1
  7. package/dist/api/doctor.js.map +1 -1
  8. package/dist/api/quickstart.d.ts +3 -0
  9. package/dist/api/quickstart.js +9 -4
  10. package/dist/api/quickstart.js.map +1 -1
  11. package/dist/cli/phaseCommands.js +7 -0
  12. package/dist/cli/phaseCommands.js.map +1 -1
  13. package/dist/codegraph/CodeIntelligence.d.ts +135 -0
  14. package/dist/codegraph/CodeIntelligence.js +460 -0
  15. package/dist/codegraph/CodeIntelligence.js.map +1 -0
  16. package/dist/context/ContextBudget.d.ts +90 -0
  17. package/dist/context/ContextBudget.js +322 -0
  18. package/dist/context/ContextBudget.js.map +1 -0
  19. package/dist/eval/WorkflowEval.d.ts +161 -0
  20. package/dist/eval/WorkflowEval.js +379 -0
  21. package/dist/eval/WorkflowEval.js.map +1 -0
  22. package/dist/governance/GovernanceRoi.d.ts +25 -0
  23. package/dist/governance/GovernanceRoi.js +70 -0
  24. package/dist/governance/GovernanceRoi.js.map +1 -0
  25. package/dist/governance/ProgressiveGovernance.d.ts +22 -0
  26. package/dist/governance/ProgressiveGovernance.js +159 -0
  27. package/dist/governance/ProgressiveGovernance.js.map +1 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.js +4 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/memory/MemoryBrain.d.ts +135 -0
  32. package/dist/memory/MemoryBrain.js +635 -0
  33. package/dist/memory/MemoryBrain.js.map +1 -0
  34. package/dist/memory/MemoryFabric.d.ts +118 -0
  35. package/dist/memory/MemoryFabric.js +281 -0
  36. package/dist/memory/MemoryFabric.js.map +1 -0
  37. package/dist/memory/MemoryLearning.d.ts +61 -0
  38. package/dist/memory/MemoryLearning.js +203 -0
  39. package/dist/memory/MemoryLearning.js.map +1 -0
  40. package/dist/memory/index.d.ts +3 -0
  41. package/dist/memory/index.js +4 -0
  42. package/dist/memory/index.js.map +1 -0
  43. package/dist/output/GovernanceDashboard.d.ts +57 -0
  44. package/dist/output/GovernanceDashboard.js +250 -0
  45. package/dist/output/GovernanceDashboard.js.map +1 -0
  46. package/dist/output/HTMLArtifactLayer.js +31 -31
  47. package/dist/output/index.d.ts +2 -0
  48. package/dist/output/index.js +1 -0
  49. package/dist/output/index.js.map +1 -1
  50. package/dist/prompts/VibeTemplateGallery.js +121 -121
  51. package/dist/runtime/FinalReportGuard.d.ts +16 -0
  52. package/dist/runtime/FinalReportGuard.js +14 -0
  53. package/dist/runtime/FinalReportGuard.js.map +1 -0
  54. package/dist/runtime/RuntimeDoctor.d.ts +23 -0
  55. package/dist/runtime/RuntimeDoctor.js +151 -0
  56. package/dist/runtime/RuntimeDoctor.js.map +1 -0
  57. package/dist/runtime/RuntimeEvidenceLedger.d.ts +50 -0
  58. package/dist/runtime/RuntimeEvidenceLedger.js +89 -0
  59. package/dist/runtime/RuntimeEvidenceLedger.js.map +1 -0
  60. package/dist/runtime/SessionLedger.d.ts +53 -0
  61. package/dist/runtime/SessionLedger.js +104 -0
  62. package/dist/runtime/SessionLedger.js.map +1 -0
  63. package/dist/runtime/index.d.ts +4 -0
  64. package/dist/runtime/index.js +5 -0
  65. package/dist/runtime/index.js.map +1 -0
  66. package/dist/skills/SkillRadar.d.ts +83 -0
  67. package/dist/skills/SkillRadar.js +384 -0
  68. package/dist/skills/SkillRadar.js.map +1 -0
  69. package/dist/workflow/EngineeringStandards.js +69 -66
  70. package/dist/workflow/EngineeringStandards.js.map +1 -1
  71. package/dist/workflow/GovernanceTemplatePacks.js +126 -126
  72. package/dist/workflow/GovernanceTemplates.d.ts +1 -1
  73. package/dist/workflow/GovernanceTemplates.js +500 -229
  74. package/dist/workflow/GovernanceTemplates.js.map +1 -1
  75. package/dist/workflow/ResourceGovernance.js +27 -18
  76. package/dist/workflow/ResourceGovernance.js.map +1 -1
  77. package/dist/workflow/VerificationCommands.d.ts +11 -0
  78. package/dist/workflow/VerificationCommands.js +2 -0
  79. package/dist/workflow/VerificationCommands.js.map +1 -1
  80. package/dist/workflow/VerificationProfile.d.ts +2 -1
  81. package/dist/workflow/VerificationProfile.js +3 -0
  82. package/dist/workflow/VerificationProfile.js.map +1 -1
  83. package/dist/workflow/WorkflowArtifactWriter.js +2 -1
  84. package/dist/workflow/WorkflowArtifactWriter.js.map +1 -1
  85. package/dist/workflow/WorkflowEngine.js +4 -1
  86. package/dist/workflow/WorkflowEngine.js.map +1 -1
  87. package/dist/workflow/WorkspaceSafety.d.ts +9 -0
  88. package/dist/workflow/WorkspaceSafety.js +49 -0
  89. package/dist/workflow/WorkspaceSafety.js.map +1 -0
  90. package/dist/workflow/gates/GateSystem.d.ts +12 -1
  91. package/dist/workflow/gates/GateSystem.js +106 -0
  92. package/dist/workflow/gates/GateSystem.js.map +1 -1
  93. package/dist/workflow/types.d.ts +1 -1
  94. package/docs/CODE_INTELLIGENCE.md +138 -0
  95. package/docs/CONTEXT_BUDGET.md +87 -0
  96. package/docs/GOVERNANCE_DASHBOARD.md +69 -0
  97. package/docs/MEMORY_BRAIN.md +104 -0
  98. package/docs/MEMORY_FABRIC.md +107 -0
  99. package/docs/README.md +76 -0
  100. package/docs/RUNTIME_EVIDENCE.md +101 -0
  101. package/docs/SKILL_RADAR.md +115 -0
  102. package/docs/WORKFLOW_EVAL.md +151 -0
  103. package/docs/start/README.md +42 -0
  104. package/docs/start/agent-governance-demo.md +107 -0
  105. package/docs/start/quickstart.md +127 -0
  106. package/examples/demo-projects/agent-governance-demo/README.md +37 -0
  107. package/examples/demo-projects/agent-governance-demo/package.json +16 -0
  108. package/examples/demo-projects/agent-governance-demo/src/oauth-state.ts +39 -0
  109. package/examples/demo-projects/agent-governance-demo/tests/oauth-state.test.ts +52 -0
  110. package/package.json +14 -3
@@ -0,0 +1,118 @@
1
+ import type { IKnowledgeBase } from '../knowledge/KnowledgeBase.js';
2
+ import { RuntimeEvidenceLedger } from '../runtime/RuntimeEvidenceLedger.js';
3
+ import { SessionLedger, type RuntimeSessionLevel } from '../runtime/SessionLedger.js';
4
+ export interface MemoryFabricOptions {
5
+ projectDir?: string;
6
+ scaleDir?: string;
7
+ evidenceLedger?: RuntimeEvidenceLedger;
8
+ sessionLedger?: SessionLedger;
9
+ knowledgeBase?: Pick<IKnowledgeBase, 'recall' | 'recallByVector'>;
10
+ }
11
+ export interface ContextPackInput {
12
+ task: string;
13
+ taskId?: string;
14
+ sessionId?: string;
15
+ level?: RuntimeSessionLevel;
16
+ files?: string[];
17
+ budgetTokens?: number;
18
+ knowledgeTopK?: number;
19
+ }
20
+ export interface ContextPackTask {
21
+ task: string;
22
+ taskId?: string;
23
+ sessionId?: string;
24
+ level: RuntimeSessionLevel;
25
+ files: string[];
26
+ }
27
+ export interface ContextPackBudget {
28
+ limit: number;
29
+ used: number;
30
+ remaining: number;
31
+ overBudget: boolean;
32
+ }
33
+ export interface ContextPackSection {
34
+ id: string;
35
+ title: string;
36
+ priority: number;
37
+ estimatedTokens: number;
38
+ included: boolean;
39
+ reason?: string;
40
+ items: ContextPackItem[];
41
+ }
42
+ export interface ContextPackOmittedSection {
43
+ id: string;
44
+ title: string;
45
+ reason: string;
46
+ estimatedTokens: number;
47
+ }
48
+ export interface ContextPack {
49
+ version: '1.0';
50
+ generatedAt: string;
51
+ task: ContextPackTask;
52
+ budget: ContextPackBudget;
53
+ sections: ContextPackSection[];
54
+ omittedSections: ContextPackOmittedSection[];
55
+ }
56
+ export type ContextPackItem = RuntimeEvidenceContextItem | RuntimeSessionContextItem | KnowledgeContextItem | GraphContextItem;
57
+ export interface RuntimeEvidenceContextItem {
58
+ type: 'runtime-evidence';
59
+ id: string;
60
+ kind: string;
61
+ title: string;
62
+ status: string;
63
+ command?: string;
64
+ exitCode?: number;
65
+ summary: string;
66
+ createdAt: string;
67
+ artifacts?: string[];
68
+ }
69
+ export interface RuntimeSessionContextItem {
70
+ type: 'session-event';
71
+ id: string;
72
+ eventType: string;
73
+ phase?: string;
74
+ message?: string;
75
+ createdAt: string;
76
+ }
77
+ export interface KnowledgeContextItem {
78
+ type: 'knowledge';
79
+ id: string;
80
+ title: string;
81
+ tags: string[];
82
+ contentRef: string;
83
+ verified: boolean;
84
+ relevance: number;
85
+ preview?: string;
86
+ }
87
+ export interface GraphContextItem {
88
+ type: 'graph';
89
+ path: string;
90
+ kind: 'graph-report' | 'graph-manifest';
91
+ summary: string;
92
+ }
93
+ export declare class MemoryFabric {
94
+ private projectDir;
95
+ private scaleRoot;
96
+ private evidenceLedger;
97
+ private sessionLedger;
98
+ private knowledgeBase?;
99
+ constructor(options?: MemoryFabricOptions);
100
+ createContextPack(input: ContextPackInput): Promise<ContextPack>;
101
+ private runtimeEvidenceSection;
102
+ private sessionEventsSection;
103
+ private knowledgeSection;
104
+ private graphSection;
105
+ private toKnowledgeItem;
106
+ }
107
+ export interface MemoryDoctorCheck {
108
+ name: string;
109
+ status: 'ok' | 'warn' | 'fail';
110
+ message: string;
111
+ }
112
+ export interface MemoryDoctorReport {
113
+ ok: boolean;
114
+ checks: MemoryDoctorCheck[];
115
+ pack: ContextPack;
116
+ }
117
+ export declare function doctorMemoryFabric(options: MemoryFabricOptions, input: ContextPackInput): Promise<MemoryDoctorReport>;
118
+ export declare function renderContextPackMarkdown(pack: ContextPack): string;
@@ -0,0 +1,281 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { isAbsolute, join, relative, resolve } from 'node:path';
3
+ import { RuntimeEvidenceLedger } from '../runtime/RuntimeEvidenceLedger.js';
4
+ import { SessionLedger } from '../runtime/SessionLedger.js';
5
+ import { redactEvidenceText } from '../tools/ToolEvidenceStore.js';
6
+ const DEFAULT_BUDGET_TOKENS = 4_000;
7
+ const DEFAULT_KNOWLEDGE_TOP_K = 5;
8
+ export class MemoryFabric {
9
+ constructor(options = {}) {
10
+ this.projectDir = resolve(options.projectDir ?? process.cwd());
11
+ this.scaleRoot = isAbsolute(options.scaleDir ?? '')
12
+ ? options.scaleDir
13
+ : join(this.projectDir, options.scaleDir ?? '.scale');
14
+ this.evidenceLedger = options.evidenceLedger ?? new RuntimeEvidenceLedger({
15
+ projectDir: this.projectDir,
16
+ scaleDir: this.scaleRoot,
17
+ createDirs: false,
18
+ });
19
+ this.sessionLedger = options.sessionLedger ?? new SessionLedger({
20
+ projectDir: this.projectDir,
21
+ scaleDir: this.scaleRoot,
22
+ createDirs: false,
23
+ });
24
+ this.knowledgeBase = options.knowledgeBase;
25
+ }
26
+ async createContextPack(input) {
27
+ const currentSession = this.sessionLedger.current();
28
+ const task = {
29
+ task: input.task,
30
+ taskId: input.taskId ?? currentSession?.taskId,
31
+ sessionId: input.sessionId ?? currentSession?.sessionId,
32
+ level: input.level ?? currentSession?.level ?? 'M',
33
+ files: input.files ?? [],
34
+ };
35
+ const budgetLimit = Math.max(1, Math.floor(input.budgetTokens ?? DEFAULT_BUDGET_TOKENS));
36
+ const baseTokens = estimateTokens(JSON.stringify(task));
37
+ const drafts = [
38
+ this.runtimeEvidenceSection(task),
39
+ this.sessionEventsSection(task),
40
+ await this.knowledgeSection(task, input.knowledgeTopK ?? DEFAULT_KNOWLEDGE_TOP_K),
41
+ this.graphSection(),
42
+ ];
43
+ let used = baseTokens;
44
+ const sections = [];
45
+ const omittedSections = [];
46
+ for (const draft of drafts.sort((a, b) => b.priority - a.priority)) {
47
+ const estimatedTokens = estimateTokens(JSON.stringify(draft.items));
48
+ if (draft.items.length === 0) {
49
+ const reason = 'no data available';
50
+ sections.push({ ...draft, estimatedTokens, included: false, reason });
51
+ omittedSections.push({ id: draft.id, title: draft.title, reason, estimatedTokens });
52
+ continue;
53
+ }
54
+ if (used + estimatedTokens <= budgetLimit) {
55
+ used += estimatedTokens;
56
+ sections.push({ ...draft, estimatedTokens, included: true });
57
+ continue;
58
+ }
59
+ const reason = `omitted by token budget (${used + estimatedTokens}/${budgetLimit})`;
60
+ sections.push({ ...draft, estimatedTokens, included: false, reason, items: [] });
61
+ omittedSections.push({ id: draft.id, title: draft.title, reason, estimatedTokens });
62
+ }
63
+ const overBudget = used > budgetLimit;
64
+ return {
65
+ version: '1.0',
66
+ generatedAt: new Date().toISOString(),
67
+ task,
68
+ budget: {
69
+ limit: budgetLimit,
70
+ used,
71
+ remaining: Math.max(0, budgetLimit - used),
72
+ overBudget,
73
+ },
74
+ sections,
75
+ omittedSections,
76
+ };
77
+ }
78
+ runtimeEvidenceSection(task) {
79
+ const records = this.evidenceLedger.list({
80
+ taskId: task.taskId,
81
+ sessionId: task.sessionId,
82
+ limit: 8,
83
+ });
84
+ const items = prioritizeEvidence(records).map(toRuntimeEvidenceItem);
85
+ return {
86
+ id: 'runtime-evidence',
87
+ title: 'Runtime Evidence',
88
+ priority: 100,
89
+ items,
90
+ };
91
+ }
92
+ sessionEventsSection(task) {
93
+ const sessionId = task.sessionId;
94
+ const events = sessionId ? this.sessionLedger.listEvents(sessionId).slice(-12) : [];
95
+ return {
96
+ id: 'session-events',
97
+ title: 'Session Events',
98
+ priority: 80,
99
+ items: events.map(toSessionEventItem),
100
+ };
101
+ }
102
+ async knowledgeSection(task, topK) {
103
+ if (!this.knowledgeBase) {
104
+ return { id: 'knowledge', title: 'Knowledge Recall', priority: 60, items: [] };
105
+ }
106
+ const query = [task.task, task.files.join(' ')].filter(Boolean).join('\n');
107
+ const entries = this.knowledgeBase.recallByVector
108
+ ? await this.knowledgeBase.recallByVector(query, topK)
109
+ : await this.knowledgeBase.recall({ verifiedOnly: true, limit: topK });
110
+ return {
111
+ id: 'knowledge',
112
+ title: 'Knowledge Recall',
113
+ priority: 60,
114
+ items: entries.map(entry => this.toKnowledgeItem(entry)),
115
+ };
116
+ }
117
+ graphSection() {
118
+ const candidates = [
119
+ { path: join(this.projectDir, 'graphify-out', 'GRAPH_REPORT.md'), kind: 'graph-report' },
120
+ { path: join(this.scaleRoot, 'graph', 'manifest.json'), kind: 'graph-manifest' },
121
+ ];
122
+ const items = candidates
123
+ .filter(candidate => existsSync(candidate.path))
124
+ .map(candidate => ({
125
+ type: 'graph',
126
+ path: normalizeProjectPath(this.projectDir, candidate.path),
127
+ kind: candidate.kind,
128
+ summary: previewFile(candidate.path, 220),
129
+ }));
130
+ return {
131
+ id: 'graph',
132
+ title: 'Project Graph',
133
+ priority: 40,
134
+ items,
135
+ };
136
+ }
137
+ toKnowledgeItem(entry) {
138
+ const contentPath = isAbsolute(entry.contentRef)
139
+ ? entry.contentRef
140
+ : join(this.projectDir, entry.contentRef);
141
+ return {
142
+ type: 'knowledge',
143
+ id: entry.id,
144
+ title: entry.title,
145
+ tags: entry.tags,
146
+ contentRef: entry.contentRef,
147
+ verified: entry.verified,
148
+ relevance: Number(entry.relevance.toFixed(3)),
149
+ preview: safePreviewProjectFile(this.projectDir, contentPath, 240),
150
+ };
151
+ }
152
+ }
153
+ export async function doctorMemoryFabric(options, input) {
154
+ const pack = await new MemoryFabric(options).createContextPack(input);
155
+ const checks = [
156
+ pack.budget.overBudget
157
+ ? {
158
+ name: 'Context budget',
159
+ status: 'fail',
160
+ message: `Base context uses ${pack.budget.used}/${pack.budget.limit} estimated tokens; raise budget or narrow task scope.`,
161
+ }
162
+ : {
163
+ name: 'Context budget',
164
+ status: 'ok',
165
+ message: `Context pack uses ${pack.budget.used}/${pack.budget.limit} estimated tokens.`,
166
+ },
167
+ ];
168
+ const budgetOmissions = pack.omittedSections.filter(section => section.reason.includes('budget'));
169
+ if (budgetOmissions.length > 0) {
170
+ checks.push({
171
+ name: 'Budget omissions',
172
+ status: 'warn',
173
+ message: `${budgetOmissions.length} lower-priority section(s) omitted by token budget.`,
174
+ });
175
+ }
176
+ const evidence = pack.sections.find(section => section.id === 'runtime-evidence');
177
+ checks.push(evidence?.included
178
+ ? { name: 'Runtime evidence', status: 'ok', message: `${evidence.items.length} evidence item(s) included.` }
179
+ : { name: 'Runtime evidence', status: 'warn', message: evidence?.reason ?? 'No runtime evidence included.' });
180
+ return {
181
+ ok: !checks.some(check => check.status === 'fail'),
182
+ checks,
183
+ pack,
184
+ };
185
+ }
186
+ export function renderContextPackMarkdown(pack) {
187
+ const lines = [
188
+ '# SCALE Memory Context Pack',
189
+ '',
190
+ `- Task: ${pack.task.task}`,
191
+ `- Task ID: ${pack.task.taskId ?? 'n/a'}`,
192
+ `- Session ID: ${pack.task.sessionId ?? 'n/a'}`,
193
+ `- Level: ${pack.task.level}`,
194
+ `- Budget: ${pack.budget.used}/${pack.budget.limit} estimated tokens`,
195
+ '',
196
+ ];
197
+ for (const section of pack.sections) {
198
+ lines.push(`## ${section.title}`);
199
+ lines.push(`- Status: ${section.included ? 'included' : 'omitted'}`);
200
+ if (section.reason)
201
+ lines.push(`- Reason: ${section.reason}`);
202
+ for (const item of section.items) {
203
+ lines.push(`- ${renderItemSummary(item)}`);
204
+ }
205
+ lines.push('');
206
+ }
207
+ return lines.join('\n');
208
+ }
209
+ function prioritizeEvidence(records) {
210
+ return [...records].sort((a, b) => evidenceStatusRank(b.status) - evidenceStatusRank(a.status));
211
+ }
212
+ function evidenceStatusRank(status) {
213
+ if (status === 'failed')
214
+ return 3;
215
+ if (status === 'passed')
216
+ return 2;
217
+ return 1;
218
+ }
219
+ function toRuntimeEvidenceItem(record) {
220
+ return {
221
+ type: 'runtime-evidence',
222
+ id: record.id,
223
+ kind: record.kind,
224
+ title: record.title,
225
+ status: record.status,
226
+ command: record.command,
227
+ exitCode: record.exitCode,
228
+ summary: truncate(record.summary, 220),
229
+ createdAt: record.createdAt,
230
+ artifacts: record.artifacts,
231
+ };
232
+ }
233
+ function toSessionEventItem(event) {
234
+ return {
235
+ type: 'session-event',
236
+ id: event.id,
237
+ eventType: event.type,
238
+ phase: event.phase,
239
+ message: event.message ? truncate(event.message, 220) : undefined,
240
+ createdAt: event.createdAt,
241
+ };
242
+ }
243
+ function renderItemSummary(item) {
244
+ if (item.type === 'runtime-evidence')
245
+ return `[${item.status}] ${item.title}: ${item.summary}`;
246
+ if (item.type === 'session-event')
247
+ return `${item.eventType}${item.phase ? `/${item.phase}` : ''}: ${item.message ?? item.createdAt}`;
248
+ if (item.type === 'knowledge')
249
+ return `${item.title} (${item.tags.join(', ') || 'no tags'})`;
250
+ return `${item.kind}: ${item.path}`;
251
+ }
252
+ function estimateTokens(text) {
253
+ return Math.max(1, Math.ceil(text.length / 4));
254
+ }
255
+ function previewFile(path, maxChars) {
256
+ try {
257
+ const preview = truncate(readFileSync(path, 'utf-8').replace(/\s+/g, ' ').trim(), maxChars);
258
+ return redactEvidenceText(preview).value;
259
+ }
260
+ catch {
261
+ return '';
262
+ }
263
+ }
264
+ function safePreviewProjectFile(projectDir, filePath, maxChars) {
265
+ const resolvedProject = resolve(projectDir);
266
+ const resolvedFile = resolve(filePath);
267
+ const rel = relative(resolvedProject, resolvedFile);
268
+ if (rel.startsWith('..') || isAbsolute(rel))
269
+ return undefined;
270
+ if (!existsSync(resolvedFile))
271
+ return undefined;
272
+ return previewFile(resolvedFile, maxChars);
273
+ }
274
+ function truncate(value, maxChars) {
275
+ return value.length > maxChars ? `${value.slice(0, maxChars - 3)}...` : value;
276
+ }
277
+ function normalizeProjectPath(projectDir, filePath) {
278
+ const rel = relative(projectDir, filePath);
279
+ return rel && !rel.startsWith('..') ? rel.replace(/\\/g, '/') : filePath;
280
+ }
281
+ //# sourceMappingURL=MemoryFabric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryFabric.js","sourceRoot":"","sources":["../../src/memory/MemoryFabric.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { ContextPack } from './MemoryFabric.js';
2
+ export type MemoryLearningCandidateStatus = 'candidate';
3
+ export type MemoryLearningRecommendedAction = 'review-for-knowledge-base' | 'resolve-failures-first' | 'record-more-evidence';
4
+ export interface MemoryLearningEvidenceSummary {
5
+ id: string;
6
+ status: string;
7
+ title: string;
8
+ summary: string;
9
+ command?: string;
10
+ exitCode?: number;
11
+ }
12
+ export interface MemoryLearningSessionSummary {
13
+ id: string;
14
+ eventType: string;
15
+ phase?: string;
16
+ message?: string;
17
+ }
18
+ export interface MemoryLearningCandidate {
19
+ version: '1.0';
20
+ id: string;
21
+ status: MemoryLearningCandidateStatus;
22
+ generatedAt: string;
23
+ title: string;
24
+ task: string;
25
+ taskId?: string;
26
+ sessionId?: string;
27
+ level: string;
28
+ summary: string;
29
+ recommendedAction: MemoryLearningRecommendedAction;
30
+ promotable: boolean;
31
+ tags: string[];
32
+ evidenceIds: string[];
33
+ sessionEventIds: string[];
34
+ knowledgeIds: string[];
35
+ graphRefs: string[];
36
+ evidenceSummaries: MemoryLearningEvidenceSummary[];
37
+ sessionSummaries: MemoryLearningSessionSummary[];
38
+ warnings: string[];
39
+ contextBudget: {
40
+ used: number;
41
+ limit: number;
42
+ remaining: number;
43
+ overBudget: boolean;
44
+ };
45
+ contentRef: string;
46
+ }
47
+ export interface MemoryLearningSettlement {
48
+ candidate: MemoryLearningCandidate;
49
+ files: {
50
+ json: string;
51
+ markdown: string;
52
+ };
53
+ }
54
+ export interface SettleMemoryLearningOptions {
55
+ projectDir?: string;
56
+ scaleDir?: string;
57
+ pack: ContextPack;
58
+ now?: () => Date;
59
+ }
60
+ export declare function settleMemoryLearning(options: SettleMemoryLearningOptions): MemoryLearningSettlement;
61
+ export declare function renderMemoryLearningCandidateMarkdown(candidate: MemoryLearningCandidate): string;
@@ -0,0 +1,203 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { isAbsolute, join, relative, resolve } from 'node:path';
3
+ import { redactEvidenceText, redactEvidenceValue } from '../tools/ToolEvidenceStore.js';
4
+ export function settleMemoryLearning(options) {
5
+ const projectDir = resolve(options.projectDir ?? process.cwd());
6
+ const scaleRoot = resolveScaleRoot(projectDir, options.scaleDir);
7
+ const now = options.now ?? (() => new Date());
8
+ const generatedAt = now().toISOString();
9
+ const runtimeEvidence = includedItems(options.pack, 'runtime-evidence');
10
+ const sessionEvents = includedItems(options.pack, 'session-event');
11
+ const knowledgeItems = includedItems(options.pack, 'knowledge');
12
+ const graphRefs = options.pack.sections
13
+ .flatMap(section => section.items)
14
+ .filter(item => item.type === 'graph')
15
+ .map(item => item.path);
16
+ const failed = runtimeEvidence.filter(item => item.status === 'failed');
17
+ const passed = runtimeEvidence.filter(item => item.status === 'passed');
18
+ const warnings = buildWarnings(options.pack, runtimeEvidence, failed);
19
+ const recommendedAction = chooseRecommendedAction(runtimeEvidence, failed, passed);
20
+ const promotable = recommendedAction === 'review-for-knowledge-base';
21
+ const baseId = options.pack.task.taskId ?? options.pack.task.sessionId ?? options.pack.task.task;
22
+ const id = `MLC-${safePathSegment(baseId)}`;
23
+ const jsonPath = join(scaleRoot, 'memory', 'learning-candidates', `${id}.json`);
24
+ const markdownPath = join(scaleRoot, 'memory', 'learning-candidates', `${id}.md`);
25
+ const contentRef = normalizeProjectPath(projectDir, markdownPath);
26
+ const candidate = sanitizeCandidate({
27
+ version: '1.0',
28
+ id,
29
+ status: 'candidate',
30
+ generatedAt,
31
+ title: `Learning candidate: ${options.pack.task.task}`,
32
+ task: options.pack.task.task,
33
+ taskId: options.pack.task.taskId,
34
+ sessionId: options.pack.task.sessionId,
35
+ level: options.pack.task.level,
36
+ summary: buildSummary(options.pack, runtimeEvidence, failed, passed),
37
+ recommendedAction,
38
+ promotable,
39
+ tags: buildTags(options.pack, runtimeEvidence),
40
+ evidenceIds: runtimeEvidence.map(item => item.id),
41
+ sessionEventIds: sessionEvents.map(item => item.id),
42
+ knowledgeIds: knowledgeItems.map(item => item.id),
43
+ graphRefs,
44
+ evidenceSummaries: runtimeEvidence.map(item => ({
45
+ id: item.id,
46
+ status: item.status,
47
+ title: item.title,
48
+ summary: item.summary,
49
+ command: item.command,
50
+ exitCode: item.exitCode,
51
+ })),
52
+ sessionSummaries: sessionEvents.map(item => ({
53
+ id: item.id,
54
+ eventType: item.eventType,
55
+ phase: item.phase,
56
+ message: item.message,
57
+ })),
58
+ warnings,
59
+ contextBudget: { ...options.pack.budget },
60
+ contentRef,
61
+ });
62
+ ensureDir(join(scaleRoot, 'memory', 'learning-candidates'));
63
+ writeFileSync(jsonPath, JSON.stringify(candidate, null, 2), 'utf-8');
64
+ writeFileSync(markdownPath, renderMemoryLearningCandidateMarkdown(candidate), 'utf-8');
65
+ return {
66
+ candidate,
67
+ files: {
68
+ json: jsonPath,
69
+ markdown: markdownPath,
70
+ },
71
+ };
72
+ }
73
+ export function renderMemoryLearningCandidateMarkdown(candidate) {
74
+ const lines = [
75
+ `# ${candidate.title}`,
76
+ '',
77
+ `- Status: ${candidate.status}`,
78
+ `- Task ID: ${candidate.taskId ?? 'n/a'}`,
79
+ `- Session ID: ${candidate.sessionId ?? 'n/a'}`,
80
+ `- Level: ${candidate.level}`,
81
+ `- Recommended action: ${candidate.recommendedAction}`,
82
+ `- Promotable: ${candidate.promotable ? 'yes' : 'no'}`,
83
+ '',
84
+ '## Summary',
85
+ '',
86
+ candidate.summary,
87
+ '',
88
+ '## Runtime Evidence',
89
+ '',
90
+ ];
91
+ for (const evidence of candidate.evidenceSummaries) {
92
+ lines.push(`- [${evidence.status}] ${evidence.title} (${evidence.id})`);
93
+ lines.push(` - Summary: ${evidence.summary}`);
94
+ if (evidence.command)
95
+ lines.push(` - Command: \`${evidence.command}\``);
96
+ if (evidence.exitCode !== undefined)
97
+ lines.push(` - Exit code: ${evidence.exitCode}`);
98
+ }
99
+ if (candidate.evidenceSummaries.length === 0)
100
+ lines.push('- none');
101
+ lines.push('', '## Session Events', '');
102
+ for (const event of candidate.sessionSummaries) {
103
+ lines.push(`- ${event.eventType}${event.phase ? `/${event.phase}` : ''}: ${event.message ?? event.id}`);
104
+ }
105
+ if (candidate.sessionSummaries.length === 0)
106
+ lines.push('- none');
107
+ lines.push('', '## Warnings', '');
108
+ for (const warning of candidate.warnings)
109
+ lines.push(`- ${warning}`);
110
+ if (candidate.warnings.length === 0)
111
+ lines.push('- none');
112
+ lines.push('');
113
+ return lines.join('\n');
114
+ }
115
+ function includedItems(pack, type) {
116
+ return pack.sections
117
+ .filter(section => section.included)
118
+ .flatMap(section => section.items)
119
+ .filter(item => item.type === type);
120
+ }
121
+ function buildWarnings(pack, runtimeEvidence, failed) {
122
+ const warnings = [];
123
+ if (failed.length > 0)
124
+ warnings.push(`${failed.length} failed runtime evidence item(s) must be resolved before promotion.`);
125
+ if (runtimeEvidence.length === 0)
126
+ warnings.push('No runtime evidence was included; record verification before promoting this candidate.');
127
+ for (const section of pack.omittedSections) {
128
+ warnings.push(`Context section omitted: ${section.title} (${section.reason}).`);
129
+ }
130
+ return warnings;
131
+ }
132
+ function chooseRecommendedAction(runtimeEvidence, failed, passed) {
133
+ if (failed.length > 0)
134
+ return 'resolve-failures-first';
135
+ if (runtimeEvidence.length === 0 || passed.length === 0)
136
+ return 'record-more-evidence';
137
+ return 'review-for-knowledge-base';
138
+ }
139
+ function buildSummary(pack, runtimeEvidence, failed, passed) {
140
+ if (failed.length > 0) {
141
+ return `Task "${pack.task.task}" produced ${failed.length} failed runtime evidence item(s); keep this as a learning candidate but do not promote it yet.`;
142
+ }
143
+ if (passed.length > 0) {
144
+ return `Task "${pack.task.task}" has ${passed.length}/${runtimeEvidence.length} passed runtime evidence item(s) and can be reviewed for durable knowledge promotion.`;
145
+ }
146
+ return `Task "${pack.task.task}" has no passed runtime evidence yet; use this candidate as a reminder to collect verification before long-term promotion.`;
147
+ }
148
+ function buildTags(pack, runtimeEvidence) {
149
+ const tags = new Set([
150
+ 'runtime-learning',
151
+ `level-${pack.task.level.toLowerCase()}`,
152
+ ]);
153
+ if (runtimeEvidence.some(item => item.status === 'passed'))
154
+ tags.add('verified-evidence');
155
+ if (runtimeEvidence.some(item => item.status === 'failed'))
156
+ tags.add('failed-evidence');
157
+ return [...tags];
158
+ }
159
+ function sanitizeCandidate(candidate) {
160
+ const redacted = redactEvidenceValue(candidate).value;
161
+ return redactCandidateText(redacted);
162
+ }
163
+ function redactCandidateText(candidate) {
164
+ const redact = (value) => {
165
+ if (value === undefined)
166
+ return undefined;
167
+ return redactEvidenceText(value).value;
168
+ };
169
+ return {
170
+ ...candidate,
171
+ title: redact(candidate.title) ?? candidate.title,
172
+ task: redact(candidate.task) ?? candidate.task,
173
+ summary: redact(candidate.summary) ?? candidate.summary,
174
+ evidenceSummaries: candidate.evidenceSummaries.map(item => ({
175
+ ...item,
176
+ title: redact(item.title) ?? item.title,
177
+ summary: redact(item.summary) ?? item.summary,
178
+ command: redact(item.command),
179
+ })),
180
+ sessionSummaries: candidate.sessionSummaries.map(item => ({
181
+ ...item,
182
+ message: redact(item.message),
183
+ })),
184
+ warnings: candidate.warnings.map(item => redact(item) ?? item),
185
+ };
186
+ }
187
+ function ensureDir(dir) {
188
+ if (!existsSync(dir))
189
+ mkdirSync(dir, { recursive: true });
190
+ }
191
+ function resolveScaleRoot(projectDir, scaleDir) {
192
+ return isAbsolute(scaleDir ?? '') ? scaleDir : join(projectDir, scaleDir ?? '.scale');
193
+ }
194
+ function safePathSegment(value) {
195
+ return value.replace(/[^a-zA-Z0-9._-]/g, '-').slice(0, 120) || 'memory-learning';
196
+ }
197
+ function normalizeProjectPath(projectDir, filePath) {
198
+ const rel = relative(projectDir, filePath);
199
+ return rel && !rel.startsWith('..') && !isAbsolute(rel)
200
+ ? rel.replace(/\\/g, '/')
201
+ : filePath;
202
+ }
203
+ //# sourceMappingURL=MemoryLearning.js.map